CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ استثنا سنڀالڻ
John Squirrels
سطح
San Francisco

جاوا ۾ استثنا سنڀالڻ

گروپ ۾ شايع ٿيل
سلام اڄ اسان جاوا ۾ استثناء جي سنڀال تي هڪ ويجهي نظر ڪنداسين. مون کي ان جو ذڪر ڪرڻ کان نفرت آهي، پر پروگرامر جي ڪم جو هڪ وڏو حصو غلطين سان معاملو آهي. گهڻو ڪري، هن جي پنهنجي. اهو ظاهر ٿئي ٿو ته اهڙا ماڻهو نه آهن جيڪي غلطي نه ڪندا آهن. ۽ نه ته اهڙا پروگرام آهن. يقينا، جڏهن غلطي سان معاملو ڪرڻ، بنيادي شيء ان جي سبب کي سمجهڻ آهي. ۽ ڪيتريون ئي شيون پروگرام ۾ بگ پيدا ڪري سگھن ٿيون. ڪجهه نقطي تي، جاوا جي تخليق ڪندڙ پاڻ کان پڇيو ته سڀ کان وڌيڪ ممڪن پروگرامنگ غلطي سان ڇا ڪيو وڃي؟ مڪمل طور تي انهن کان بچڻ حقيقي نه آهي، پروگرامر مواد لکڻ جي قابل آهن جيڪي توهان تصور به نٿا ڪري سگهو. :) تنهن ڪري، اسان کي ضرورت آهي ته ٻوليءَ کي غلطين سان ڪم ڪرڻ لاءِ هڪ ميکانيزم ڏيو. ٻين لفظن ۾، جيڪڏھن توھان جي پروگرام ۾ ڪا نقص آھي، توھان کي ڪجھھ قسم جي اسڪرپٽ جي ضرورت آھي اڳتي ڇا ڪجي. جڏهن ڪا غلطي ٿئي ٿي ته پروگرام کي ڇا ڪرڻ گهرجي؟ اڄ اسان هن ميڪانيزم سان واقف ٿي ويندا. ان کي " جاوا ۾ استثنا " سڏيو ويندو آهي.

ڇا هڪ استثنا آهي؟

هڪ استثنا هڪ ​​غير معمولي، غير منصوبابندي واري صورتحال آهي جيڪا ٿئي ٿي جڏهن هڪ پروگرام هلندي آهي. اهڙا ڪيترائي استثنا آهن. مثال طور، توهان ڪوڊ لکيو آهي جيڪو فائل مان ٽيڪسٽ پڙهي ٿو، ۽ پهرين لائن ڏيکاري ٿو.
public class Main {

   public static void main(String[] args) throws IOException {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));
       String firstString = reader.readLine();
       System.out.println(firstString);
   }
}
پر جيڪڏهن اهڙي ڪا فائيل نه هجي ته ڇا ڪجي! پروگرام هڪ استثنا پيدا ڪندو: FileNotFoundException. آئوٽ: ٿريڊ ۾ استثنا "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (سسٽم مخصوص رستو ڳولي نه ٿو سگهي) جاوا ۾، هر استثنا هڪ ​​الڳ طبقي جي نمائندگي ڪري ٿو. اهي سڀئي استثنائي طبقا هڪ عام ”ابن ڏاڏن“ يعني Throwableوالدين طبقي مان نڪتل آهن. هڪ استثنا طبقي جو نالو عام طور تي واضح طور تي ظاهر ڪري ٿو ته استثنا ڇو ٿيو:
  • FileNotFoundException(فائل نه مليو)

  • ArithmeticException(رياضي جي عمل کي انجام ڏيڻ دوران هڪ استثنا واقع ٿيو)

  • ArrayIndexOutOfBoundsException(انڊيڪس صف جي حدن کان ٻاهر آهي). مثال طور، هي استثنا ٿئي ٿو جيڪڏهن توهان هڪ صف جي پوزيشن 23 کي ڊسپلي ڪرڻ جي ڪوشش ڪندا آهيو جنهن ۾ صرف 10 عناصر آهن.
مجموعي طور تي، جاوا ۾ لڳ ڀڳ 400 اهڙا ڪلاس آهن! ايترا گهڻا ڇو؟ انهن کي وڌيڪ آسان بڻائڻ لاءِ پروگرامرز سان ڪم ڪرڻ لاءِ. هن جو تصور ڪريو: توهان هڪ پروگرام لکندا آهيو، ۽ جڏهن اهو هلندو آهي ته اهو هڪ استثنا پيدا ڪري ٿو جيڪو هن وانگر ڏسڻ ۾ اچي ٿو:
Exception in thread "main"
هههههه :/ اهو گهڻو مدد نٿو ڪري. اهو واضح ناهي ته غلطي جو مطلب ڇا آهي يا اهو ڪٿان آيو آهي. هتي ڪا به مددگار ڄاڻ ناهي. پر جاوا ۾ استثنا ڪلاسن جي وڏي قسم پروگرامر کي ڏئي ٿي جيڪا سڀ کان وڌيڪ اهميت رکي ٿي: غلطي جو قسم ۽ ان جو امڪاني سبب (ڪلاس جي نالي ۾ شامل ٿيل). اهو ڏسڻ لاء بلڪل ٻي شيء آهي
Exception in thread "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (The system cannot find the specified path)
اهو فوري طور تي واضح آهي ته مسئلو ڇا ٿي سگهي ٿو ۽ مسئلي کي حل ڪرڻ لاءِ ڪٿي کوٽڻ شروع ڪيو وڃي! استثنا، ڪنهن به طبقن جي مثالن وانگر، شيون آهن.

جاوا ۾ استثنا کي پڪڙڻ ۽ سنڀالڻ

جاوا وٽ خاص بلاڪ ڪوڊ آھن جيڪي ڪم ڪرڻ لاءِ استثنا سان ڪم ڪن ٿا: try, catchand finally. استثنا: پڪڙڻ ۽ هٿ ڪرڻ - 2 ڪوڊ جتي پروگرامر کي يقين آهي ته هڪ استثنا ٿي سگهي ٿي tryبلاڪ ۾ رکيل آهي. ان جو مطلب اهو ناهي ته هتي هڪ استثنا ٿيندو. ان جو مطلب اهو آهي ته اهو ٿي سگهي ٿو هتي، ۽ پروگرامر هن امڪان کان واقف آهي. غلطي جو قسم جيڪو توهان ٿيڻ جي اميد رکي ٿو catchبلاڪ ۾ رکيل آهي. اهو پڻ سڀني ڪوڊ تي مشتمل آهي جنهن تي عمل ڪيو وڃي جيڪڏهن هڪ استثنا ٿئي ٿي. هتي هڪ مثال آهي:
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {

       System.out.println("Error! File not found!");
   }
}
آئوٽ: غلطي! فائل نه ملي! اسان اسان جو ڪوڊ ٻن بلاڪن ۾ رکون ٿا. پهرين بلاڪ ۾، اسان کي اميد آهي ته هڪ "فائل نه مليو" غلطي ٿي سگھي ٿي. هي tryبلاڪ آهي. ٻئي ۾، اسان پروگرام کي ٻڌايو ته ڇا ڪجي جيڪڏهن ڪو غلطي ٿئي ٿي. ۽ مخصوص غلطي جو قسم: FileNotFoundException. جيڪڏهن اسان بلاڪ جي قوس ۾ هڪ مختلف استثنا ڪلاس رکون ٿا catch، پوء FileNotFoundExceptionپڪڙي نه ويندي.
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));
       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (ArithmeticException e) {

       System.out.println("Error! File not found!");
   }
}
آئوٽ: ٿريڊ ۾ استثنا "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (سسٽم مخصوص رستو ڳولي نه ٿو سگهي) بلاڪ ۾ ڪوڊ catchنه هليو، ڇاڪاڻ ته اسان "منظم ڪيو" هن بلاڪ کي پڪڙڻ لاء ArithmeticException، ۽ بلاڪ ۾ ڪوڊ tryهڪ مختلف قسم اڇلايو: FileNotFoundException. اسان هينڊل ڪرڻ لاءِ ڪو به ڪوڊ نه لکيو آهي FileNotFoundException، تنهنڪري پروگرام ڊفالٽ معلومات ڏيکاري ٿو FileNotFoundException. هتي توهان کي ٽن شين تي ڌيان ڏيڻ جي ضرورت آهي. پهريون نمبر. هڪ دفعو بلاڪ ۾ ڪجهه لڪير تي هڪ استثنا ٿئي ٿي try، ڪوڊ جيڪو هيٺ ڏنل عمل نه ڪيو ويندو. پروگرام جي عمل کي فوري طور تي catchبلاڪ ڏانهن "جمپ". مثال طور:
public static void main(String[] args) {
   try {
       System.out.println("Divide by zero");
       System.out.println(366/0);// This line of code will throw an exception

       System.out.println("This");
       System.out.println("code");
       System.out.println("will not");
       System.out.println("be");
       System.out.println("executed!");

   } catch (ArithmeticException e) {

       System.out.println("The program jumped to the catch block!");
       System.out.println("Error! You can't divide by zero!");
   }
}
ٻاھر نڪتو: صفر کان ورهايو پروگرام ڪيچ بلاڪ ڏانھن ٽپو ڏنو! غلطي! توهان صفر سان ورهائي نٿا سگهو! بلاڪ جي ٻئي لڪير تي try، اسان 0 کي ورهائڻ جي ڪوشش ڪندا آهيون، نتيجي ۾ هڪ ArithmeticException. نتيجي طور، بلاڪ جون لائينون 3-10 تي tryعمل نه ڪيو ويندو. جيئن اسان چيو، پروگرام فوري طور تي catchبلاڪ تي عمل ڪرڻ شروع ڪري ٿو. نمبر ٻه. اتي ڪيترائي catchبلاڪ ٿي سگهن ٿا. جيڪڏهن بلاڪ ۾ ڪوڊ tryاڇلائي سگھي ٿو هڪ نه، پر مختلف قسم جا استثنا، توهان catchانهن مان هر هڪ لاء بلاڪ لکي سگهو ٿا.
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       System.out.println(366/0);
       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {

       System.out.println("Error! File not found!");

   } catch (ArithmeticException e) {

       System.out.println("Error! Division by 0!");

   }
}
هن مثال ۾، اسان ٻه catchبلاڪ لکيا آهن. جيڪڏهن هڪ بلاڪ FileNotFoundException۾ ٿئي ٿي try، پوء پهريون catchبلاڪ عمل ڪيو ويندو. جيڪڏهن هڪ ArithmeticExceptionٿئي ٿي، ٻئي بلاڪ تي عمل ڪيو ويندو. catchجيڪڏهن توهان چاهيو ته 50 بلاڪ لکي سگهو ٿا . يقينن، اهو بهتر آهي ته ڪوڊ نه لکجي جيڪو 50 مختلف قسم جا استثنا ڏئي سگهي. :) ٽيون. توهان کي ڪيئن خبر آهي ته ڪهڙو استثنا توهان جو ڪوڊ اڇلائي سگهي ٿو؟ خير، توهان شايد انهن مان ڪجهه اندازو لڳائي سگهو ٿا، پر اهو ناممڪن آهي ته توهان هر شي کي پنهنجي سر ۾ رکڻ لاء. تنهن ڪري Java compiler ڄاڻي ٿو سڀ کان وڌيڪ عام استثنا ۽ حالتون جتي اهي ٿي سگهن ٿيون. مثال طور، جيڪڏهن توهان ڪوڊ لکندا آهيو ته مرتب ڪندڙ ڄاڻي ٿو ته شايد ٻه قسم جا استثنا اڇلائي، توهان جو ڪوڊ مرتب نه ٿيندو جيستائين توهان انهن کي سنڀاليندا. اسان ان جا مثال هيٺ ڏسندا سين.

ھاڻي ڪجھ لفظ Exception Handling بابت

جاوا ۾ استثنا کي سنڀالڻ جا 2 طريقا آهن. اسان اڳ ۾ ئي پهريون ڀيرو منهن ڪيو آهي: طريقو پاڻ کي بلاڪ ۾ استثنا کي سنڀاليندو catch(). ھڪڙو ٻيو اختيار آھي: طريقو ڪال اسٽيڪ کي استثنا کي ٻيهر اڇلائي سگھي ٿو. هن جو مطلب ڇا آهي؟ مثال طور، اسان وٽ ساڳيو printFirstString()طريقو آهي، جيڪو هڪ فائل پڙهي ٿو ۽ ان جي پهرين لائن ڏيکاري ٿو:
public static void printFirstString(String filePath) {

   BufferedReader reader = new BufferedReader(new FileReader(filePath));
   String firstString = reader.readLine();
   System.out.println(firstString);
}
في الحال، اسان جو ڪوڊ گڏ نه ٿو ڪري، ڇاڪاڻ ته ان ۾ اڻڄاتل استثنا آهن. لائن 1 ۾، توھان وضاحت ڪريو فائل ڏانھن رستو. مرتب ڪندڙ ڄاڻي ٿو ته اهڙو ڪوڊ آساني سان پيدا ڪري سگهي ٿو FileNotFoundException. لائن 3 ۾، توھان فائل مان متن پڙھو. اهو عمل آساني سان نتيجو ٿي سگهي ٿو IOException(ان پٽ / آئوٽ پُٽ غلطي). ھاڻي گڏ ڪرڻ وارو توھان کي چوي ٿو، ”يار، مان ھن ڪوڊ کي منظور نه ڪندس ۽ مان ان کي مرتب نه ڪندس جيستائين توھان مون کي نه ٻڌايو ته مون کي ڇا ڪرڻ گھرجي جيڪڏھن انھن مان ھڪڙو استثنا ٿئي. !" ان جي چوڌاري حاصل ڪرڻ جو ڪو طريقو ناهي: توهان ٻنهي کي سنڀالڻ جي ضرورت آهي! اسان اڳ ۾ ئي ڄاڻون ٿا ته پهرين استثنا هٿ ڪرڻ واري طريقي جي باري ۾: اسان کي اسان جي ڪوڊ کي بلاڪ ۾ رکڻو پوندو try۽ ٻه catchبلاڪ شامل ڪرڻ گهرجن.
public static void printFirstString(String filePath) {

   try {
       BufferedReader reader = new BufferedReader(new FileReader(filePath));
       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {
       System.out.println("Error, file not found!");
       e.printStackTrace();
   } catch (IOException e) {
       System.out.println("File input/output error!");
       e.printStackTrace();
   }
}
پر هي واحد اختيار نه آهي. اسان طريقي جي اندر غلطي-هٿ واري ڪوڊ لکڻ جي بدران استثنا کي وڌيڪ اڇلائي سگهون ٿا.

Java Exception Handling Keywords

throwsاهو طريقو بيان ۾ لفظ استعمال ڪندي ڪيو ويندو آهي :
public static void printFirstString(String filePath) throws FileNotFoundException, IOException {
   BufferedReader reader = new BufferedReader(new FileReader(filePath));
   String firstString = reader.readLine();
   System.out.println(firstString);
}
لفظ کان پوءِ throws، اسان اشارو ڪريون ٿا ڪاما سان الڳ ڪيل فهرست جي سڀني قسمن جي استثناءَ جي جيڪا طريقي سان اڇلائي سگھي ٿي. ڇو؟ printFirstString()هاڻي، جيڪڏهن ڪو ماڻهو پروگرام ۾ طريقي کي سڏڻ چاهي ٿو ، هن کي يا هوء (توهان نه) کي لاڳو ڪرڻو پوندو استثنا هينڊلنگ. مثال طور، فرض ڪريو ته پروگرام ۾ ٻئي هنڌ توهان جي ساٿين مان هڪ هڪ طريقو لکيو آهي جيڪو توهان جي printFirstString()طريقي کي سڏيندو آهي:
public static void yourColleagueMethod() {

   // Your colleague's method does something

   //...and then calls your printFirstString() method with the file it needs
   printFirstString("C:\\Users\\Henry\\Desktop\\testFile.txt");
}
اسان کي غلطي ملي ٿي! هي ڪوڊ مرتب نه ٿيندو! اسان طريقي ۾ استثنا-هينڊلنگ ڪوڊ نه لکيو printFirstString(). نتيجي طور، هي ڪم هاڻي انهن جي ڪلهن تي پوي ٿو جيڪي طريقا استعمال ڪن ٿا. ٻين لفظن ۾، methodWrittenByYourColleague()طريقو هاڻي ساڳيون 2 اختيارات آهن: اهو يا ته هڪ try-catchبلاڪ استعمال ڪرڻ گهرجي ٻنهي استثنا کي سنڀالڻ لاء، يا انهن کي ٻيهر اڇلائي.
public static void yourColleagueMethod() throws FileNotFoundException, IOException {
   // The method does something

   //...and then calls your printFirstString() method with the file it needs
   printFirstString("C:\\Users\\Henry\\Desktop\\testFile.txt");
}
ٻي صورت ۾، ڪال اسٽيڪ ۾ ايندڙ طريقو- جيڪو ڪال ڪري رهيو آهي- کي methodWrittenByYourColleague()استثنا کي سنڀالڻو پوندو. ان ڪري اسان ان کي سڏين ٿا ”اُڇلڻ يا پاس ڪرڻ واري استثنا“. جيڪڏھن توھان ڪي لفظ استعمال ڪندي استثنا اُڇليو ٿا throws، توھان جو ڪوڊ مرتب ڪيو ويندو. هن موقعي تي، گڏ ڪرڻ وارو اهو چوڻ لڳي ٿو، "ٺيڪ، ٺيڪ آهي. توهان جي ڪوڊ ۾ امڪاني استثناء جو هڪ گروپ شامل آهي، پر مان ان کي گڏ ڪندس. پر اسان هن گفتگو ڏانهن موٽنداسين!" ۽ جڏهن توهان ڪنهن به طريقي کي سڏيندا آهيو جنهن ۾ اڻڄاتل استثنا آهن، مرتب ڪندڙ پنهنجو واعدو پورو ڪري ٿو ۽ توهان کي انهن جي باري ۾ ٻيهر ياد ڏياريندو آهي. آخرڪار، اسان بلاڪ جي باري ۾ ڳالهائينداسين finally(معاف ڪجو سزا لاء). هي آخري حصو آهي try-catch-finallyاستثنا کي سنڀالڻ واري ٽرمويريٽ جو. اهو مختلف آهي ته ان تي عمل ڪيو ويندو آهي، پروگرام ۾ ڇا ٿئي.
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {
       System.out.println("Error! File not found!");
       e.printStackTrace();
   } finally {
       System.out.println ("And here's the finally block!");
   }
}
هن مثال ۾، بلاڪ جي اندر ڪوڊ finallyٻنهي صورتن ۾ عمل ڪيو ويندو. جيڪڏهن بلاڪ ۾ ڪوڊ tryمڪمل طور تي هلندو آهي بغير ڪنهن استثنا جي، finallyبلاڪ آخر ۾ هلندو. جيڪڏهن بلاڪ جي اندر ڪوڊ tryهڪ استثنا سان مداخلت ڪئي وئي آهي ۽ پروگرام catchبلاڪ ڏانهن ڇڪيندو آهي، finallyبلاڪ اڃا تائين بلاڪ جي اندر ڪوڊ کان پوء هلندو catch.

اهو ڇو ضروري آهي؟

ان جو بنيادي مقصد لازمي ڪوڊ تي عمل ڪرڻ آهي: ڪوڊ جيڪو لازمي طور تي انجام ڏنو وڃي بغير حالتن جي. مثال طور، اهو اڪثر ڪري پروگرام پاران استعمال ڪيل ڪجهه وسيلن کي آزاد ڪري ٿو. اسان جي ڪوڊ ۾، اسان فائل مان معلومات پڙهڻ لاء هڪ وهڪرو کوليو ۽ ان کي BufferedReaderاعتراض ڏانهن منتقل ڪيو. اسان کي پنهنجي پڙهندڙ کي بند ڪرڻ گهرجي ۽ وسيلن کي آزاد ڪرڻ گهرجي. اهو ٿيڻ گهرجي ڪنهن به صورت ۾ - جڏهن پروگرام ڪم ڪري ٿو جيئن ان کي گهرجي، ۽ جڏهن اهو هڪ استثنا اڇلائي ٿو. بلاڪ finallyاهو ڪرڻ لاء هڪ تمام آسان جڳهه آهي:
public static void main(String[] args) throws IOException {

   BufferedReader reader = null;
   try {
       reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } finally {
       System.out.println ("And here's the finally block!");
       if (reader != null) {
           reader.close();
       }
   }
}
هاڻي اسان کي پڪ آهي ته اسان وسيلن جو خيال رکنداسين، قطع نظر ته جڏهن پروگرام هلي رهيو آهي ته ڇا ٿئي. :) اهو سڀ ڪجهه نه آهي توهان کي استثنا بابت ڄاڻڻ جي ضرورت آهي. پروگرامنگ ۾ ايرر سنڀالڻ هڪ سپر اهم موضوع آهي. ڪيترائي مضمون ان لاءِ وقف ٿيل آهن. ايندڙ سبق ۾، اسان معلوم ڪنداسين ته ڪهڙي قسم جا استثنا آهن ۽ ڪيئن پنهنجون استثنا پيدا ڪرڻ. :) پوءِ ملنداسين!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION