1. अपवाद

>

शेवटी, प्रोग्रामरने त्रुटी हाताळणी प्रमाणित आणि स्वयंचलित करण्याचा विचार केला. जेव्हा अपवादांचा शोध लावला गेला तेव्हा हे घडले . आता अपवाद यंत्रणा 80% अपवादात्मक परिस्थिती हाताळते.

जर काही विद्वान अपवादांसह आले, तर तो कदाचित त्याच्या किंवा तिच्या डॉक्टरेट प्रबंधाचा विषय असेल. जर एखाद्या प्रोग्रामरने ते शोधून काढले असेल, तर त्याला सहकर्मीकडून एक मैत्रीपूर्ण थाप मिळाली असेल: "ठीक आहे, भाऊ."

जेव्हा Java प्रोग्राममध्ये एरर येते, जसे की विभाजन करून 0, काही आश्चर्यकारक गोष्टी घडतात:

पहिली पायरी

एक विशेष अपवाद ऑब्जेक्ट तयार केला आहे, ज्यामध्ये उद्भवलेल्या त्रुटीबद्दल माहिती आहे.

Java मधील प्रत्येक गोष्ट एक ऑब्जेक्ट आहे, आणि अपवाद अपवाद नाहीत 🙂 अपवाद ऑब्जेक्ट्सचे स्वतःचे वर्ग असतात आणि त्यांना सामान्य वर्गांपेक्षा वेगळे करणारी एकमेव गोष्ट म्हणजे त्यांना वर्गाचा वारसा मिळतो Throwable.

पायरी दोन

अपवाद ऑब्जेक्ट "फेकून" आहे. कदाचित इथे शब्दरचना अधिक चांगली होऊ शकेल. "अपवाद फेकणे" हे फायर अलार्म ट्रिगर करण्यासारखे किंवा "DEFCON 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

Java मध्ये एक अपवाद पकडण्याची यंत्रणा आहे जी तुम्हाला पद्धतींची ही असामान्य समाप्ती थांबवू देते. हे असे दिसते:

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


catch4. ब्लॉक्सचा क्रम

ब्लॉकमध्ये येणारे अपवाद tryफक्त एकाच catchब्लॉकद्वारे पकडले जाऊ शकतात. तुमच्याकडे अपवाद हाताळण्याची परिस्थिती असू शकत नाही जिथे एकाधिक ब्लॉक्समधील कोड catchकार्यान्वित केला जातो.

पण ब्लॉक्सचा क्रम महत्त्वाचा आहे.

तुमच्याकडे अशी परिस्थिती असू शकते जिथे अपवाद एकाधिक ब्लॉक्सद्वारे पकडला जाऊ शकतो. तसे असल्यास, अपवाद हा जो कॅच ब्लॉक प्रथम येईल त्याद्वारे पकडला जाईल (ब्लॉकच्या सर्वात जवळ try).

तुमच्याकडे अशी परिस्थिती कशी असू शकते जिथे एकाधिक कॅच ब्लॉक समान अपवाद पकडू शकतात?

सर्व अपवाद एकाच वारसा पदानुक्रमाचे आहेत — आकृती पहा.

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

एखाद्या ArithmeticExceptionव्हेरिएबलला ऑब्जेक्ट नियुक्त केला जाऊ शकतो ज्याचा प्रकार ArithmeticExceptionकिंवा त्याच्या पूर्वज वर्गांपैकी कोणताही आहे: RuntimeException , Exceptionआणि Throwable— आकृती पहा.

आम्ही लेव्हल 21 मध्ये वारसा आणि पूर्वजांच्या वर्गांबद्दल अधिक बोलू.

हा कोड अगदी व्यवस्थित संकलित करेल:

वारसाचे फायदे:
ArithmeticException ae    = new ArithmeticException();
RuntimeException runtime  = new ArithmeticException();
Exception exception       = new ArithmeticException();
Throwable trwbl           = new ArithmeticException();

ArithmeticExceptionत्यामुळे तुम्ही वरील 4 पैकी कोणत्याही ब्लॉकला पकडू शकता catch.

उदाहरण १:

कोड कन्सोल आउटपुट
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

हा प्रकार साधारणपणे Java मधील प्रत्येक संभाव्य अपवाद पकडण्यातThrowable सक्षम आहे . जर तुम्ही ते पहिल्या ब्लॉकमध्ये ठेवले, तर कोड संकलित होणार नाही, कारण कंपाइलरला माहित आहे की कोडचे अगम्य ब्लॉक्स आहेत.catch