CodeGym /جاوا بلاگ /Random-SD /استثنا: چيڪ ٿيل، اڻ چيڪ ٿيل، ۽ ڪسٽم
John Squirrels
سطح
San Francisco

استثنا: چيڪ ٿيل، اڻ چيڪ ٿيل، ۽ ڪسٽم

گروپ ۾ شايع ٿيل
سلام پوئين سبق ۾، اسان جاوا ٻوليءَ ۾ استثناءَ کان واقف ٿياسين، ۽ مثال ڏٺاسين ته انهن سان ڪيئن ڪم ڪجي. اڄ اسان استثناءَ جي ڍانچي تي وڌيڪ تفصيلي نظر وجهنداسين، ۽ سکنداسين ته ڪيئن لکجي اسان جا پنهنجا استثنا :)

استثناءَ جا قسم

جيئن اسان اڳ ۾ چيو، جاوا ۾ ڪيترائي استثنا آهن، لڳ ڀڳ 400! پر اهي سڀئي گروپن ۾ ورهايل آهن، تنهنڪري انهن کي ياد ڪرڻ بلڪل آسان آهي. اهو ڪيئن ڏسڻ ۾ اچي ٿو: استثنا: چيڪ ٿيل، اڻ چيڪ ٿيل، ۽ ڪسٽم - 2 سڀني استثنان جو ڪلاس ۾ هڪ عام اباڙ آهي Throwable. ان مان ٻه وڏا گروهه نڪتل آهن: استثنا ( استثنا ) ۽ غلطيون ( Error ). نقص - هي جاوا ورچوئل مشين جي آپريشن سان لاڳاپيل هڪ نازڪ رن-ٽائم غلطي جي نمائندگي ڪري ٿو. اڪثر ڪيسن ۾، غلطي کي سنڀالڻ جي ضرورت ناهي، ڇاڪاڻ ته اهو ڪوڊ ۾ ڪجهه سنگين خاميون ظاهر ڪري ٿو. انهن مان سڀ کان وڌيڪ مشهور آهن StackOverflowError (اهو ٿئي ٿو، مثال طور، جڏهن ڪو طريقو پاڻ کي لامحدود طور تي سڏي ٿو) ۽ OutOfMemoryError (اهو تڏهن ٿئي ٿو جڏهن نئين شيون ٺاهڻ لاءِ ڪافي ياداشت نه هجي). جئين توهان ڏسي سگهو ٿا، انهن حالتن ۾، عام طور تي هلائڻ جي وقت تي هلائڻ لاء بلڪل ڪجھ به ناهي: ڪوڊ صرف غلط لکيو ويو آهي ۽ ٻيهر ڪم ڪرڻ جي ضرورت آهي. استثنا - هي نمائندگي ڪري ٿو، سٺو، هڪ استثنا: هڪ غير معمولي، غير منصوبابندي واري صورتحال جيڪا ٿئي ٿي جڏهن پروگرام هلندي آهي. اهي غلطي وانگر سنجيده نه آهن، پر اهي اڃا تائين اسان جي ڌيان جي ضرورت آهي. سڀئي استثنا 2 قسمن ۾ ورهايل آهن: چيڪ ٿيل ۽ اڻ چيڪ ٿيل . استثنا: چيڪ ٿيل، اڻ چيڪ ٿيل، ۽ ڪسٽم - 3 سڀئي چڪاس ٿيل استثنا ڪلاس مان نڪتل آهن Exception. ڇا مطلب آهي "چڪايو"؟ اسان ان کي آخري سبق ۾ اشارو ڪيو آهي: "جاوا ڪمپلر ان ڪري ڄاڻي ٿو سڀ کان عام استثنا ۽ حالتون جتي اهي ٿي سگهن ٿيون." مثال طور، اهو ڄاڻي ٿو ته جيڪڏهن ڪوڊ فائل مان ڊيٽا پڙهي، فائل آساني سان موجود نه ٿي سگهي. ۽ ڪيتريون ئي اهڙيون حالتون آهن (جنهن جو اهو اندازو لڳائي سگهي ٿو). ان جي مطابق، مرتب ڪندڙ اسان جي ڪوڊ کي اڳ ۾ چيڪ ڪري ٿو انهن امڪاني استثنا جي موجودگي لاء. جيڪڏهن اهو انهن کي ڳولي ٿو، اهو ڪوڊ مرتب نه ڪندو جيستائين اسان انهن کي هٿ نه ڪيو يا انهن کي ٻيهر اڇلايو. ٻيو قسم جو استثنا آهي ”اڻ چيڪ ٿيل“. اهي RuntimeExceptionطبقن مان نڪتل آهن. اهي چيڪ ٿيل استثنا کان ڪيئن مختلف آهن؟ اهو لڳي ٿو ته اتي پڻ ڪيترائي مختلف طبقن مان نڪتل آهن RuntimeException(جيڪي رن ٽائم استثنا بيان ڪن ٿا). فرق اهو آهي ته مرتب ڪندڙ انهن غلطين جي توقع نٿو ڪري. اهو چوڻ لڳي ٿو، "جڏهن ڪوڊ لکيو ويو، مون کي ڪا به مشڪوڪ شيء نه ملي، پر ان کي هلائڻ دوران ڪجهه غلط ٿي ويو. ظاهر آهي ته ڪوڊ ۾ غلطيون آهن!" ۽ واقعي هي سچ آهي. اڻ چيڪ ٿيل استثنا اڪثر ڪري پروگرامر جي غلطين جو نتيجو آهن. ۽ مرتب ڪندڙ واضح طور تي هر ممڪن خراب صورتحال جي اڳڪٿي نٿو ڪري سگهي جيڪي ماڻهو پنهنجن هٿن سان ٺاهي سگهن ٿا. :) تنهن ڪري، اهو چيڪ نٿو ڪري ته ڇا اهڙا استثنا اسان جي ڪوڊ ۾ هٿ ڪيا ويا آهن. توهان اڳ ۾ ئي ڪيترن ئي غير چيڪ ٿيل استثنان کي منهن ڏنو آهي:
  • هڪ ArithmeticException تڏهن ٿئي ٿو جڏهن صفر سان ورهائجي
  • هڪ ArrayIndexOutOfBoundsException تڏهن ٿيندو آهي جڏهن توهان صف کان ٻاهر پوزيشن تائين پهچڻ جي ڪوشش ڪندا آهيو.
يقينن، توھان تصور ڪري سگھو ٿا ته جاوا جي ٺاھيندڙن کي لازمي استثنيٰ ھينڊلنگ متعارف ڪرايو آھي، پر ھن صورت ۾ ڪوڊ تمام پيچيده ھوندو. ڪنهن به ڊويزن آپريشن لاءِ، ڇا توهان کي هڪ بلاڪ لکڻو پوندو try-catchچيڪ ڪرڻ لاءِ ته ڇا توهان اتفاقي طور تي صفر سان ورهايو آهي؟ try-catchڪنهن به وقت توهان هڪ صف تائين رسائي ڪئي، توهان کي هڪ بلاڪ لکڻو پوندو ته چيڪ ڪرڻ لاء ته توهان جي انڊيڪس حد کان ٻاهر هئي. هر شي اسپگيٽي ڪوڊ هوندو ۽ مڪمل طور تي اڻ پڙهيل هوندو. اهو سمجهه ۾ اچي ٿو ته هن خيال کي ڇڏي ڏنو ويو. try-catchنتيجي طور، اڻ چيڪ ٿيل استثناء کي بلاڪ ۾ هٿ ڪرڻ يا ٻيهر اڇلائڻ جي ضرورت ناهي (جيتوڻيڪ اهو ٽيڪنالاجي طور ممڪن آهي، جيئن غلطي سان).

پنهنجو استثنا ڪيئن اڇلايو

يقينن، جاوا جا تخليق ڪندڙ هر غير معمولي صورتحال کي پيش نه ٿا ڪري سگهن جيڪي پروگرامن ۾ پيدا ٿي سگهن ٿيون. دنيا ۾ تمام گھڻا پروگرام آھن، ۽ اھي ڏاڍا متنوع آھن. پر اهو پريشان ٿيڻ جي ڪا به شيء ناهي، ڇو ته توهان پنهنجو استثنا ٺاهي سگهو ٿا، جيڪڏهن ضروري هجي. اهو ڪرڻ بلڪل آسان آهي. توهان کي صرف پنهنجو ڪلاس ٺاهڻو آهي. توهان کي پڪ ڪرڻ گهرجي ته ان جو نالو "استثنا" سان ختم ٿئي ٿو. مرتب ڪندڙ کي ان جي ضرورت نه آهي، پر ٻيا پروگرامر جيڪي توهان جو ڪوڊ پڙهي رهيا آهن فوري طور تي سمجهي ويندا ته اهو هڪ استثناءَ وارو طبقو آهي. ان کان علاوه، ظاهر ڪريو ته ڪلاس ڪلاس مان ورثي ۾ مليل آهي Exception(مرتب کي هن جي ضرورت آهي). مثال طور، فرض ڪريو اسان وٽ ھڪڙو Dogڪلاس آھي. اسان طريقو استعمال ڪندي ڪتي کي هلائي سگهون ٿا walk(). پر اهو ڪرڻ کان اڳ، اسان کي اهو جانچڻ جي ضرورت آهي ته ڇا اسان جي پالتو جانور هڪ کالر، ليش، ۽ مزل پائڻ آهي. جيڪڏهن هن گيئر مان ڪو به غائب آهي، اسان پنهنجو استثنا اڇلائي ڇڏيو: DogIsNotReadyException . ان جو ڪوڊ هن طرح نظر اچي ٿو:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
اهو ظاهر ڪرڻ لاءِ ته ڪلاس هڪ استثنا آهي، توهان کي لکڻ جي ضرورت آهي " exceptions Exception " ڪلاس جي نالي پٺيان (هن جو مطلب آهي "ڪلاس استثنا ڪلاس مان نڪتل آهي"). Constructor ۾، اسان صرف 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!");
   }
 }

}
هاڻي اسان جو walk()طريقو هڪ DogIsNotReadyException اڇلائي ٿو . اهو لفظ اڇلائڻ سان ڪيو ويندو آهي. جيئن اسان اڳ ۾ چيو آهي، هڪ استثنا هڪ ​​اعتراض آهي. تنهن ڪري، جڏهن هڪ استثنا ٿئي ٿي (ڪتو ڪجهه غائب آهي) اسان جي طريقي ۾، اسان هڪ نئين DogIsNotReadyExceptionشئي ٺاهي ۽ ان کي اڇلائي لفظ استعمال ڪندي اڇلائي ڇڏيو. اسان شامل ڪندا آهيون " throws DogIsNotReadyException " طريقي جي اعلان ۾. ٻين لفظن ۾، هاڻي مرتب ڪندڙ کي خبر آهي ته walk()طريقي کي سڏڻ هڪ غير معمولي صورتحال ۾ تبديل ٿي سگهي ٿو. ان جي مطابق، هن استثنا کي هٿي وٺڻ گهرجي جيڪڏهن اسان هن طريقي کي اسان جي پروگرام ۾ ڪٿي سڏيندا آهيون. اچو ته هن طريقي سان ڪرڻ جي ڪوشش ڪريو 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);
   }
}
ھاڻي اچو ته ڪنسول جي ٻاھرين کي ڏسو: کالر آن آھي! مغز جاري آهي! اسان سير لاء تيار ٿي رهيا آهيون! دوست هلڻ لاءِ تيار ناهي! سامان چيڪ ڪريو! سامان جي جانچ ڪندي! ڇا کالر تي آهي؟ سچ پچ تي آهي؟ ڪوڙو آهي ڇا؟ صحيح ڏسو ته ڪيترو وڌيڪ معلوماتي ڪنسول آئوٽ هو! اسان پروگرام ۾ کنيل هر قدم کي ڏسو؛ اسان ڏسون ٿا ته غلطي ڪٿي ٿي آهي، ۽ اسان پڻ فوري طور تي ڏسي سگهون ٿا ته اسان جو ڪتو غائب آهي. :) ۽ اهو آهي ته توهان ڪيئن پنهنجو استثنا پيدا ڪيو. جئين توهان ڏسي سگهو ٿا، ان بابت ڪا به پيچيده ناهي. ۽ جيتوڻيڪ جاوا جي تخليق ڪندڙن کي ٻولي ۾ شامل ڪرڻ جي زحمت نه ڪئي وئي هڪ خاص استثنا ناقص ليس ڪتن لاءِ، اسان انهن جي نگراني کي مقرر ڪيو آهي. :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION