ट्रैक
/
Java
Java
/
अभ्यास
/
कैलकुलेटर की पहेली
कैलकुलेटर की पहेली

कैलकुलेटर की पहेली

सीखने का अभ्यास

परिचय

एक्सेप्शन

Java प्रोग्रामिंग भाषा एरर और दूसरी असामान्य घटनाओं को संभालने के लिए एक्सेप्शन का उपयोग करती है।

एक्सेप्शन क्या है

एक्सेप्शन एक ऐसी घटना है जो प्रोग्राम के चलने के दौरान होती है और निर्देशों के सामान्य प्रवाह को बाधित कर देती है। Java में एक्सेप्शन स्पष्ट रूप से उठाए जाते हैं। एक्सेप्शन उठाने की क्रिया को एक्सेप्शन फेंकना कहा जाता है, और उसे संभालने की क्रिया को एक्सेप्शन पकड़ना कहा जाता है।

Java में सभी एक्सेप्शन Exception क्लास की सबक्लास हैं, और Exception क्लास खुद Throwable की सबक्लास है।

Java दो तरह के एक्सेप्शन में अंतर करती है:

  1. चेक्ड एक्सेप्शन
  2. अनचेक्ड एक्सेप्शन
चेक्ड एक्सेप्शन

चेक्ड एक्सेप्शन ऐसी असामान्य स्थितियाँ हैं जिनके बारे में किसी एप्लिकेशन को पहले से सोच लेना चाहिए और जिनसे उसे उबरना चाहिए। चेक्ड एक्सेप्शन का एक उदाहरण FileNotFoundException है, जो तब होता है जब कोई मेथड ऐसी फाइल पढ़ने की कोशिश कर रहा हो जो मौजूद नहीं है।

इस तरह के एक्सेप्शन की जाँच कंपाइल के समय होती है। जो मेथड चेक्ड एक्सेप्शन फेंकते हैं, उन्हें अपनी मेथड सिग्नेचर में यह बताना चाहिए। और जो कोड ऐसे मेथड को कॉल करता है जो चेक्ड एक्सेप्शन फेंक सकता है, उसे उस एक्सेप्शन को संभालना ज़रूरी है, वरना वह कोड कंपाइल नहीं होगा।

सभी चेक्ड एक्सेप्शन Exception की सबक्लास हैं, पर वे RuntimeException की सबक्लास नहीं हैं।

अनचेक्ड एक्सेप्शन

अनचेक्ड एक्सेप्शन ऐसी असामान्य स्थितियाँ हैं जिनका अनुमान किसी एप्लिकेशन को आम तौर पर पहले से नहीं हो पाता और जिनसे वह उबर नहीं पाता। अनचेक्ड एक्सेप्शन का एक उदाहरण NullPointerException है, जो तब होता है जब कोई मेथड ऐसी वैल्यू की उम्मीद कर रहा हो जो null नहीं है, पर उसे null मिल जाए।

इस तरह के एक्सेप्शन की जाँच कंपाइल के समय नहीं होती। जो मेथड अनचेक्ड एक्सेप्शन फेंकते हैं, उन्हें अपनी मेथड सिग्नेचर में यह बताना ज़रूरी नहीं है। और जो कोड ऐसे मेथड को कॉल करता है जो अनचेक्ड एक्सेप्शन फेंक सकता है, उसे उस एक्सेप्शन को संभालना भी ज़रूरी नहीं है।

सभी अनचेक्ड एक्सेप्शन RuntimeException की सबक्लास हैं, और RuntimeException खुद Exception की सबक्लास है।

एक्सेप्शन फेंकना

Java में कोई मेथड throw स्टेटमेंट का उपयोग करके एक्सेप्शन फेंक सकता है।

चेक्ड एक्सेप्शन फेंकना

किसी मेथड से चेक्ड एक्सेप्शन फेंकते समय throws कीवर्ड का उपयोग करके मेथड सिग्नेचर में यह बताना ज़रूरी होता है, जैसा कि नीचे दिए उदाहरण में दिखाया गया है। इससे मेथड को कॉल करने वाले कोड को पहले से यह सोचना पड़ता है कि कोई एक्सेप्शन फेंका जा सकता है, और उसी के अनुसार उसे संभालना पड़ता है।

public class InsufficientBalanceException extends Exception {

}

public class BankAccount {
  public void withdraw(double amount) throws InsufficientBalanceException {
    if (balance < amount) {
      throw new InsufficientBalanceException();
    }

    // rest of the method implementation
  }
}
अनचेक्ड एक्सेप्शन फेंकना

किसी मेथड से अनचेक्ड एक्सेप्शन फेंकते समय मेथड सिग्नेचर में यह बताना ज़रूरी नहीं है, हालाँकि ऐसा किया जा सकता है।

public class BankAccount {
  public void withdraw(double amount) {
    if (amount < 0) {
      throw new IllegalArgumentException("Cannot withdraw a negative amount");
    }

    // rest of the method implementation
  }
}

एक्सेप्शन संभालना

Java में एक्सेप्शन संभालने का काम try, catch और finally कीवर्ड से किया जाता है।

  • जो कोड स्टेटमेंट एक्सेप्शन फेंक सकते हैं, उन्हें try ब्लॉक में लपेटना चाहिए।
  • try ब्लॉक के बाद एक या अधिक catch ब्लॉक आते हैं, जो try ब्लॉक में फेंके गए एक्सेप्शन पकड़ते हैं।
  • catch ब्लॉकों के बाद चाहें तो एक finally ब्लॉक भी रख सकते हैं, जो try ब्लॉक के बाद हमेशा चलता है, चाहे एक्सेप्शन फेंका गया हो या नहीं।

नीचे का उदाहरण दिखाता है कि ये कीवर्ड कैसे काम करते हैं:

public class ATM {
  public void withdraw(BankAccount bankAccount, double amount) {
    try {
      System.out.println("Withdrawing " + amount);
      bankAccount.withdraw(amount);
      System.out.println("Withdrawal succeeded");
    } catch (InsufficientBalanceException) {
      System.out.println("Withdrawal failed: insufficient balance");
    } catch (RuntimeException e) {
      System.out.println("Withdrawal failed: " + e.getMessage());
    } finally {
      System.out.println("Current balance: " + bankAccount.getBalance());
    }
  }
}

इस उदाहरण में, जब कोई एक्सेप्शन नहीं फेंका जाता, तब यह प्रिंट होता है:

Withdrawing 10.0
Withdrawal succeeded
Current balance: 5.0

लेकिन अगर bankAccount.withdraw(amount) स्टेटमेंट InsufficientBalanceException फेंकता है, तो यह प्रिंट होता है:

Withdrawing 10.0
Withdrawal failed: insufficient balance
Current balance: 5.0

या फिर, अगर bankAccount.withdraw(amount) की वजह से कोई अनचेक्ड एक्सेप्शन फेंका जाता है, तो यह प्रिंट होता है:

Withdrawing -10.0
Withdrawal failed: Cannot withdraw a negative amount
Current balance: 5.0

एरर

Java में एरर नाम की एक अलग श्रेणी भी है। एरर ऐसी गंभीर समस्याएँ हैं जो किसी एप्लिकेशन के बाहर की होती हैं। एरर का एक उदाहरण OutOfMemoryError है, जो तब होता है जब कोई एप्लिकेशन सिस्टम पर उपलब्ध मेमोरी से ज़्यादा मेमोरी इस्तेमाल करने की कोशिश कर रहा हो।

अनचेक्ड एक्सेप्शन की तरह एरर की भी जाँच कंपाइल के समय नहीं होती। फर्क यह है कि एरर सिस्टम लेवल की समस्याएँ दिखाती हैं और आम तौर पर इन्हें एप्लिकेशन की जगह Java वर्चुअल मशीन या वातावरण फेंकता है। एप्लिकेशन को आम तौर पर इन्हें पकड़ने या संभालने की कोशिश नहीं करनी चाहिए।

Java में सभी एरर Error क्लास की सबक्लास हैं।

निर्देश

इस अभ्यास में आप एक साधारण पूर्णांक कैलकुलेटर के लिए एरर हैंडलिंग बनाएँगे। बातें आसान रखने के लिए, जोड़, गुणा और भाग निकालने के मेथड पहले से दिए गए हैं।

लक्ष्य यह है कि दिए गए आर्गुमेंट 16, 51 और + के साथ एक ऐसा कैलकुलेटर काम करे जो इस पैटर्न वाली स्ट्रिंग लौटाए: 16 + 51 = 67।

CalculatorConundrum calculator = new CalculatorConundrum();

calculator.calculate(16, 51, "+");
// => returns "16 + 51 = 67"

calculator.calculate(32, 6, "*");
// => returns "32 * 6 = 192"

calculator.calculate(512, 4, "/");
// => returns "512 / 4 = 128"

1. कुछ बुनियादी ऑपरेशनों के लिए calculate मेथड लागू कीजिए

इस टास्क में जो मुख्य मेथड लागू करना है वह CalculatorConundrum.calculate() है। यह तीन आर्गुमेंट लेता है। पहले दो आर्गुमेंट operand1 और operand2 पूर्णांक संख्याएँ हैं, जिन पर कोई ऑपरेशन चलेगा। तीसरा आर्गुमेंट operation स्ट्रिंग टाइप का है, और इस अभ्यास में इन ऑपरेशनों को लागू करना ज़रूरी है:

  • + स्ट्रिंग से जोड़
  • * स्ट्रिंग से गुणा
  • / स्ट्रिंग से भाग

2. गलत ऑपरेशनों को संभालिए

गलत ऑपरेशनों को संभालने के लिए CalculatorConundrum.calculate() मेथड को अपडेट कीजिए:

  • जब operation आर्गुमेंट null हो, तो Operation cannot be null संदेश के साथ एक IllegalArgumentException थ्रो होना चाहिए।
  • जब operation आर्गुमेंट "" हो, तो Operation cannot be empty संदेश के साथ एक IllegalArgumentException थ्रो होना चाहिए।
  • जब operation आर्गुमेंट +, * या / के अलावा कोई और ऑपरेशन हो, तो Operation '{operation}' does not exist संदेश के साथ एक IllegalOperationException थ्रो होना चाहिए।
calculator.calculate(10, 1, null);
// => throws IllegalArgumentException with message "Operation cannot be null"

calculator.calculate(10, 1, "");
// => throws IllegalArgumentException with message "Operation cannot be empty"

calculator.calculate(10, 1, "-");
// => throws IllegalOperationException with message "Operation '-' does not exist"

3. शून्य से भाग देने पर थ्रो हुए एक्सेप्शन को संभालिए

Java में शून्य से भाग देने की कोशिश करने पर एक ArithmeticException थ्रो होता है। CalculatorConundrum.calculate() मेथड को अपडेट कीजिए ताकि वह इस एक्सेप्शन को कैच करे और फिर Division by zero is not allowed संदेश तथा कैच किए गए ArithmeticException को उसके कारण के रूप में लेते हुए एक IllegalOperationException थ्रो करे।

calculator.calculate(512, 0, "/");
// => throws IllegalOperationException with message "Division by zero is not allowed"
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Java Exercism

कैलकुलेटर की पहेली शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Java को 26 कॉन्सेप्ट158 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।