1. अपवाद

>

लंबे समय तक, प्रोग्रामर ने त्रुटि प्रबंधन को मानकीकृत और स्वचालित करने के बारे में सोचा। यह तब हुआ जब अपवादों का आविष्कार किया गया। अब अपवाद तंत्र 80% असाधारण स्थितियों को संभालता है।

अगर कुछ विद्वान अपवादों के साथ आए, तो यह संभवतः उनके डॉक्टरेट शोध प्रबंध का विषय था। यदि कोई प्रोग्रामर इसके साथ आया था, तो उसे एक सहकर्मी से पीठ पर एक दोस्ताना थपथपाया होगा: "ठीक है, भाई लगता है।"

जब जावा प्रोग्राम में कोई त्रुटि होती है, जैसे कि विभाजन द्वारा 0, कुछ अद्भुत चीजें होती हैं:

पहला कदम

एक विशेष अपवाद वस्तु बनाई जाती है, जिसमें हुई त्रुटि के बारे में जानकारी होती है।

जावा में सब कुछ एक वस्तु है, और अपवाद कोई अपवाद नहीं हैं 🙂 अपवाद वस्तुओं की अपनी कक्षाएं होती हैं, और केवल एक चीज जो उन्हें सामान्य कक्षाओं से अलग करती है, वह यह है कि वे कक्षा को विरासत में मिलाते हैं Throwable

दूसरा चरण

अपवाद वस्तु "फेंक दी गई" है। शायद यहाँ शब्दांकन बेहतर हो सकता है। "अपवाद फेंकना" फायर अलार्म ट्रिगर करने या "डेफकॉन 1" अलर्ट बजने जैसा है।

जब जावा मशीन में एक अपवाद फेंका जाता है, तो प्रोग्राम का सामान्य संचालन बंद हो जाता है और "आपातकालीन प्रोटोकॉल" शुरू हो जाते हैं।

तीसरा कदम

जिस तरीके से अपवाद फेंका गया था वह तुरंत बाहर निकल जाता है। कॉलिंग विधि को अपवाद दिया जाता है, जो तुरंत बाहर निकल जाता है। और इसी तरह चेन को नीचे तब तक चलाते रहें जब तक कि mainमेथड बाहर न निकल जाए। जब mainविधि समाप्त हो जाती है, तो कार्यक्रम भी समाप्त हो जाता है।

उदाहरण:

कोड कंसोल आउटपुट
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Your attention, please! Preparing for the end of the world");
      endTheWorld();
      System.out.println("The world ended successfully");
   }

   public static void endTheWorld()
   {
      System.out.println("We're doing something important");
      doSomeWork(0);
      System.out.println("Everything is working well");
   }

   public static void doSomeWork(int n)
   {
      System.out.println("Nothing terrible will happen: " + n);
      System.out.println(2 / n);
      System.out.println("Nothing terrible happened: " + n);
   }
}
Your attention, please! Preparing for the end of the world
We're doing something important
Nothing terrible will happen: 0

लाइन 20 पर एक अपवाद होता है: 0 से विभाजन। जावा मशीन तुरंत एक अपवाद बनाता है - एक ArithmeticExceptionवस्तु और इसे विधि में "फेंकता" है।

विधि divide()तुरंत समाप्त हो जाती है, इसलिए हम कभी भी स्ट्रिंग नहीं देखते हैं: कुछ भी भयानक नहीं हुआ: 0. कार्यक्रम endTheWorld()विधि पर लौटता है, और स्थिति खुद को दोहराती है: सिस्टम में एक अनियंत्रित अपवाद है, जिसका अर्थ है कि विधि endTheWorld()भी असामान्य रूप से समाप्त हो जाती है। तब mainविधि समाप्त हो जाती है, और कार्यक्रम बंद हो जाता है।

इन अपवादों का उद्देश्य क्या है? ठीक है, आप विशेष प्रकार के अपवादों को पकड़ने के लिए अपना स्वयं का कोड लिख सकते हैं और असाधारण स्थितियों को संभालने के लिए अपना स्वयं का तर्क लिख सकते हैं।


2. अपवादों को पकड़ना:try-catch

जावा में एक अपवाद पकड़ने वाला तंत्र है जो आपको तरीकों की इस असामान्य समाप्ति को रोकने देता है। यह इस तरह दिख रहा है:

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}

इस निर्माण को try-catchब्लॉक कहा जाता है।

कोड जहां अपवाद हो सकता है, घुंघराले ब्रेसिज़ में लपेटा जाता है, शब्द से पहले try

घुंघराले ब्रेसिज़ के बाद, हमारे पास catchकीवर्ड और, कोष्ठक के अंदर, एक अपवाद चर की घोषणा है । इसके बाद घुंघराले ब्रेसिज़ होते हैं जो निर्दिष्ट प्रकार का अपवाद होने पर कोड को निष्पादित करने के लिए लपेटते हैं

यदि " प्राथमिक कोड " के निष्पादन के दौरान कोई अपवाद नहीं फेंका जाता है , तो कैच ब्लॉक के अंदर का कोड निष्पादित नहीं किया जाएगा। यदि कोई अपवाद होता है, तो यह होगा (यदि फेंके गए अपवाद का प्रकार कोष्ठक में चर के प्रकार के समान है)।

उदाहरण:

कोड कंसोल आउटपुट
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Hadron Collider launched");

      try
      {
         launchHadronCollider(1);
         launchHadronCollider(0);
      }
      catch(Exception e)
      {
         System.out.println("Error! Caught an exception");
         System.out.println("The planet was sucked into a black hole!");
      }

      System.out.println("The Hadron Collider stopped");
   }

   public static void launchHadronCollider(int n)
   {
      System.out.println("Everything is working well: " + n);
      System.out.println(2/n);
      System.out.println("There are no problems: " + n);
   }
}
Hadron Collider launched
Everything is working fine: 1
2
There are no problems: 1
Everything is working fine: 0
Error! Caught an exception
The planet has been sucked into a black hole!
The Hadron Collider is stopped


3. एकाधिक catchब्लॉक

एकाधिक कैच ब्लॉक

सिद्धांत रूप में, कोड के एक ब्लॉक में सभी प्रकार के अपवादों को फेंका जा सकता है। कुछ को आप एक तरह से संभालना चाहेंगे, दूसरों को दूसरे तरीके से, और फिर भी अन्य को आप बिल्कुल भी नहीं संभालने का फैसला करेंगे।

जावा डेवलपर्स ने आपकी मदद करने का फैसला किया और आपको ब्लॉक के बाद एक नहीं बल्कि कई catchब्लॉक लिखने दिए।try

try
{
   // Code where an exception might occur
}
catch (ExceptionType1 name1)
{
   // Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
   // Code for handling ExceptionType2
}
   catch (ExceptionType3 name3)
{
   // Code for handling ExceptionType3
}

उदाहरण:

कोड कंसोल आउटपुट
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch (ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method


4. catchब्लॉकों का क्रम

किसी ब्लॉक में होने वाले अपवादों को केवल एक ही ब्लॉक tryद्वारा पकड़ा जा सकता है । आपके पास अपवाद प्रबंधन की स्थिति नहीं हो सकती है जहां एकाधिक ब्लॉक से कोड निष्पादित हो जाता है।catchcatch

लेकिन ब्लॉकों का क्रम मायने रखता है।

आपके पास ऐसी स्थिति हो सकती है जहां एकाधिक ब्लॉकों द्वारा अपवाद पकड़ा जा सकता है। यदि ऐसा है, तो जो भी पकड़ ब्लॉक पहले आता है ( tryब्लॉक के निकटतम) द्वारा अपवाद पकड़ा जाएगा।

आपके पास ऐसी स्थिति कैसे हो सकती है जहां एकाधिक कैच ब्लॉक एक ही अपवाद को पकड़ सकें?

सभी अपवाद एकल वंशानुक्रम पदानुक्रम से संबंधित हैं - चित्र देखें।

अपवाद पदानुक्रम

एक ArithmeticExceptionऑब्जेक्ट को एक वेरिएबल को असाइन किया जा सकता है जिसका प्रकार है ArithmeticExceptionया इसका कोई पूर्वज वर्ग: RuntimeException , Exceptionऔर Throwable— आरेख देखें।

हम स्तर 21 में वंशानुक्रम और पूर्वज वर्गों के बारे में अधिक बात करेंगे।

यह कोड ठीक संकलित करेगा:

वंशानुक्रम के लाभ:
ArithmeticException ae    = new ArithmeticException();
RuntimeException runtime  = new ArithmeticException();
Exception exception       = new ArithmeticException();
Throwable trwbl           = new ArithmeticException();

तो आप उपरोक्त ArithmeticException4 ब्लॉकों में से किसी एक को पकड़ सकते हैं।catch

उदाहरण 1:

कोड कंसोल आउटपुट
class Solution
{
   public static void main(String[] args)
   {
      System.out.println("Start of main method");
      try
      {
         calculate(0);
      }
      catch(ArithmeticException e)
      {
         System.out.println("Division by 0");
      }
      catch(Exception e)
      {
         System.out.println("Caught some kind of exception");
      }

      System.out.println("End of main method");
   }

   public static void calculate(int n)
   {
      System.out.println("Start of calculate method: " + n);
      System.out.println(2/n);
      System.out.println("End of calculate method: " + n);
   }
}
Start of main method
Start of calculate method: 0
Division by 0
End of main method

इस उदाहरण में, और ब्लॉक ArithmeticExceptionदोनों द्वारा पकड़ा जा सकता है । यह ब्लॉक के निकटतम ब्लॉक द्वारा पकड़ा जाएगा - पहला ब्लॉक।catch (Exception e)catch (ArithmeticException e)trycatch

आश्चर्य से बचने के लिए, ब्लॉकों की सूची के अंत के पास ब्लॉक रखना सबसे अच्छा है catchजो लगभग हर अपवाद को पकड़ सकता है ।catch

प्रकार आमतौर पर जावा में हर संभावित अपवाद को पकड़नेThrowable में सक्षम होता है । यदि आप इसे पहले ब्लॉक में रखते हैं, तो कोड कंपाइल नहीं होगा, क्योंकि कंपाइलर जानता है कि कोड के अगम्य ब्लॉक हैं।catch