CodeGym /Java Blog /यादृच्छिक /अपवाद: चेक केलेले, अनचेक केलेले आणि सानुकूल
John Squirrels
पातळी 41
San Francisco

अपवाद: चेक केलेले, अनचेक केलेले आणि सानुकूल

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! शेवटच्या धड्यात, आम्ही जावा भाषेतील अपवादांशी परिचित झालो, आणि त्यांच्यासोबत कसे कार्य करावे याची उदाहरणे पाहिली. आज आपण अपवादांच्या रचनेचा सखोल विचार करू, आणि आपले स्वतःचे अपवाद कसे लिहायचे ते शिकू :)

अपवादांचे प्रकार

आम्ही आधी म्हटल्याप्रमाणे, जावामध्ये बरेच अपवाद आहेत, जवळजवळ 400! परंतु ते सर्व गटांमध्ये विभागलेले आहेत, म्हणून त्यांना लक्षात ठेवणे खूप सोपे आहे. हे असे दिसते: अपवाद: चेक केलेले, अनचेक केलेले आणि सानुकूल - 2 सर्व अपवादांचा वर्गात एक सामान्य पूर्वज असतो Throwable. त्यातून दोन प्रमुख गट तयार झाले आहेत: अपवाद ( अपवाद ) आणि त्रुटी ( त्रुटी ). एरर - हे Java वर्च्युअल मशीनच्या ऑपरेशनशी संबंधित एक गंभीर रन-टाइम त्रुटी दर्शवते. बहुतेक प्रकरणांमध्ये, त्रुटी हाताळण्याची आवश्यकता नाही, कारण ती कोडमधील काही गंभीर त्रुटी दर्शवते. यापैकी सर्वात प्रसिद्ध आहेत StackOverflowError (हे घडते, उदाहरणार्थ, जेव्हा एखादी पद्धत अविरतपणे कॉल करते) आणि OutOfMemoryError(नवीन वस्तू तयार करण्यासाठी पुरेशी मेमरी नसताना हे घडते). जसे आपण पाहू शकता, या परिस्थितींमध्ये, सहसा रन टाइममध्ये हाताळण्यासाठी पूर्णपणे काहीही नसते: कोड फक्त चुकीचा लिहिलेला आहे आणि पुन्हा कार्य करणे आवश्यक आहे. अपवाद - हे एक अपवाद दर्शवते: एक अपवादात्मक, अनियोजित परिस्थिती जी प्रोग्राम चालू असताना उद्भवते. ते त्रुटीसारखे गंभीर नाहीत, परंतु तरीही त्यांना आमचे लक्ष देणे आवश्यक आहे. सर्व अपवाद 2 प्रकारांमध्ये विभागलेले आहेत: चेक केलेले आणि अनचेक केलेले . अपवाद: चेक केलेले, अनचेक केलेले आणि सानुकूल - 3 सर्व तपासलेले अपवाद वर्गातून घेतले आहेत Exception. "चेक केलेले" म्हणजे काय? आम्ही शेवटच्या धड्यात याचा उल्लेख केला आहे: "जावा कंपाइलरला सर्वात सामान्य अपवाद आणि ते कोणत्या परिस्थितीत येऊ शकतात हे माहित आहे." उदाहरणार्थ, जर कोड फाईलमधील डेटा वाचत असेल तर ती फाइल सहजपणे अस्तित्वात नाही. आणि अशा अनेक परिस्थिती आहेत (ज्याचा अंदाज लावता येईल). त्यानुसार, कंपाइलर या संभाव्य अपवादांच्या उपस्थितीसाठी आमचा कोड आगाऊ तपासतो. जर ते सापडले तर, जोपर्यंत आम्ही ते हाताळत नाही किंवा पुन्हा फेकून देत नाही तोपर्यंत तो कोड संकलित करणार नाही. अपवादाचा दुसरा प्रकार "अनचेक" आहे. ते वर्गातून घेतले जातात RuntimeException. ते तपासलेल्या अपवादांपेक्षा वेगळे कसे आहेत? असे दिसते की तेथे बरेच वेगवेगळे वर्ग देखील आहेतRuntimeException(जे रनटाइम अपवादांचे वर्णन करतात). फरक असा आहे की कंपाइलरला या त्रुटींचा अंदाज येत नाही. असे म्हणताना दिसते आहे की, "कोड लिहिला तेव्हा मला काही संशयास्पद वाटले नाही, परंतु तो चालू असताना काहीतरी चूक झाली. वरवर पाहता, कोडमध्ये त्रुटी आहेत!" आणि खरंच हे खरं आहे. अनचेक केलेले अपवाद बहुतेकदा प्रोग्रामर त्रुटींचे परिणाम असतात. आणि कंपाइलर स्पष्टपणे प्रत्येक संभाव्य वाईट परिस्थितीचा अंदाज लावू शकत नाही जे लोक त्यांच्या स्वत: च्या हातांनी तयार करू शकतात. :) म्हणून, आमच्या कोडमध्ये असे अपवाद हाताळले जातात की नाही हे तपासत नाही. तुम्ही आधीच अनेक अनचेक अपवादांचा सामना केला आहे:
  • शून्याने भागताना अंकगणित अपवाद येतो
  • जेव्हा तुम्ही अॅरेच्या बाहेरच्या स्थितीत प्रवेश करण्याचा प्रयत्न करता तेव्हा एक ArrayIndexOutOfBoundsException उद्भवते.
अर्थात, तुम्ही कल्पना करू शकता की Java च्या निर्मात्यांनी अनिवार्य अपवाद हाताळणी सुरू केली असती, परंतु या प्रकरणात कोड खूप क्लिष्ट असेल. try-catchकोणत्याही भागाकार ऑपरेशनसाठी, तुम्ही चुकून शून्याने भागले की नाही हे तपासण्यासाठी तुम्हाला ब्लॉक लिहावा लागेल का ? try-catchकोणत्याही वेळी तुम्ही अ‍ॅरेमध्ये प्रवेश करता, तुमचा इंडेक्स मर्यादेबाहेर आहे की नाही हे तपासण्यासाठी तुम्हाला ब्लॉक लिहावा लागेल . सर्व काही स्पेगेटी कोड असेल आणि पूर्णपणे वाचण्यायोग्य असेल. ही कल्पना सोडून देण्यात आली आहे असे समजते. परिणामी, अनचेक केलेले अपवाद ब्लॉक्समध्ये हाताळले जाणे किंवा पुन्हा फेकणे आवश्यक नाही try-catch(जरी हे तांत्रिकदृष्ट्या शक्य आहे, त्रुटी प्रमाणे).

आपला स्वतःचा अपवाद कसा टाकायचा

अर्थात, Java चे निर्माते प्रोग्राम्समध्ये उद्भवणाऱ्या प्रत्येक अपवादात्मक परिस्थितीचा अंदाज घेऊ शकत नाहीत. जगात बरेच कार्यक्रम आहेत आणि ते खूप वैविध्यपूर्ण आहेत. परंतु हे काळजी करण्यासारखे काही नाही, कारण आवश्यक असल्यास, आपण स्वतःचा अपवाद तयार करू शकता. हे करणे खूप सोपे आहे. तुम्हाला फक्त तुमचा स्वतःचा वर्ग तयार करायचा आहे. त्याचे नाव "अपवाद" ने संपेल याची खात्री असावी. कंपाइलरला याची आवश्यकता नाही, परंतु तुमचा कोड वाचणारे इतर प्रोग्रामर लगेच समजतील की हा अपवाद वर्ग आहे. याशिवाय, क्लास क्लासकडून वारशाने मिळालेला आहे हे दर्शवा Exception(कंपाइलरला याची आवश्यकता आहे). उदाहरणार्थ, समजा आपल्याकडे एक Dogवर्ग आहे. आम्ही वापरून कुत्रा चालणे शकताwalk()पद्धत पण ते करण्यापूर्वी, आपल्या पाळीव प्राण्याने कॉलर, पट्टा आणि थूथन घातले आहे की नाही हे तपासले पाहिजे. यापैकी कोणतेही गियर गहाळ असल्यास, आम्ही आमचा स्वतःचा अपवाद टाकतो: DogIsNotReadyException . त्याचा कोड यासारखा दिसतो:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
वर्ग हा अपवाद आहे हे दर्शविण्यासाठी, तुम्हाला वर्गाच्या नावापुढे " exceptions exception " लिहावे लागेल (याचा अर्थ "वर्ग हा अपवाद वर्गातून आला आहे"). कन्स्ट्रक्टरमध्ये, आम्ही Exceptionस्ट्रिंग संदेशासह क्लास कन्स्ट्रक्टरला कॉल करतो (अपवाद आढळल्यास, आम्ही वापरकर्त्याला संदेश, त्रुटीचे वर्णन दर्शवू). आमच्या वर्ग कोडमध्ये हे कसे दिसते ते येथे आहे:

public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;


   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
आता आमची पद्धत DogIsNotReadyExceptionwalk() टाकते . हे कीवर्ड थ्रो सह केले जाते. आम्ही आधी म्हटल्याप्रमाणे, अपवाद म्हणजे ऑब्जेक्ट. म्हणून, जेव्हा आमच्या पद्धतीमध्ये अपवाद आढळतो (कुत्र्याला काहीतरी गहाळ होते), तेव्हा आम्ही एक नवीन ऑब्जेक्ट तयार करतो आणि थ्रो कीवर्ड वापरून फेकतो. आम्ही मेथड डिक्लेरेशनमध्ये " throws DogIsNotReadyException " जोडतो. दुसऱ्या शब्दांत सांगायचे तर, आता कंपाइलरला याची जाणीव आहे की मेथडला कॉल करणे अपवादात्मक परिस्थितीत बदलू शकते. त्यानुसार, आम्ही आमच्या प्रोग्राममध्ये ही पद्धत कुठेतरी कॉल केल्यास हा अपवाद हाताळला जाणे आवश्यक आहे. चला या पद्धतीत करण्याचा प्रयत्न करूया : DogIsNotReadyExceptionwalk()main()

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
हे संकलित होणार नाही. अपवाद हाताळला जात नाही! try-catchअपवाद हाताळण्यासाठी आम्ही आमचा कोड एका ब्लॉकमध्ये गुंडाळतो :

public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
आता कन्सोल आउटपुट पाहू: कॉलर चालू आहे! थूथन चालू आहे! आम्ही फिरायला तयार आहोत! बडी फिरायला तयार नाही! गियर तपासा! गियर तपासत आहे! कॉलर चालू आहे का? पट्टा चालू आहे का? खोटे थूथन चालू आहे का? खरे कन्सोल आउटपुट किती अधिक माहितीपूर्ण होते ते पहा! कार्यक्रमात टाकलेले प्रत्येक पाऊल आपण पाहतो; कुठे त्रुटी आली ते आम्ही पाहतो आणि आमच्या कुत्र्याला नेमके काय गहाळ आहे ते देखील आम्ही लगेच पाहू शकतो. :) आणि असेच तुम्ही स्वतःचे अपवाद तयार करता. जसे आपण पाहू शकता, यात काहीही क्लिष्ट नाही. आणि जरी Java च्या निर्मात्यांनी भाषेमध्ये खराब सुसज्ज कुत्र्यांसाठी विशेष अपवाद समाविष्ट करण्याची तसदी घेतली नाही, तरीही आम्ही त्यांचे निरीक्षण निश्चित केले आहे. :)
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION