JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ استثنا
Roman
سطح

جاوا ۾ استثنا

گروپ ۾ شايع ٿيل
جڏهن مون موضوع ”استثناءُ“ ۾ آيو ته ڪيترائي سوال اڀريا جن جا جواب مون کي انٽرنيٽ جي مختلف ڪنڊن ۾ ڳولڻا پوندا ته جيئن تفصيل سان سمجھان ته اهو سڀ ڪيئن ڪم ڪري ٿو. نتيجي طور، مون پنھنجي وضاحت کي مرتب ڪيو آھي، جيڪا شايد انھن لاءِ وڌيڪ سمجھي سگھي ٿي، جن کي ھن واقعي جو سامنا ٿيو آھي. جاوا ۾ استثنا - 1ڪمپيوٽرن ۾، هڪ مداخلت پروسيسر ڏانهن هڪ ايندڙ سگنل آهي جيڪو هڪ واقعو ٿي رهيو آهي جيڪو فوري جواب جي ضرورت آهي. هڪ وقفو سگنل پروسيسر کي هلندڙ پروگرام کي روڪڻ جي ضرورت آهي ته جيئن ان کي ٿوري دير کان پوء جاري رکي سگهجي، اهو آهي، ڪمپيوٽر کي پروگرام جي عمل سان لاڳاپيل سڀني معلومات کي ياد رکڻ گهرجي. اهڙيون رڪاوٽون عارضي آهن، جيڪڏهن موتمار نه آهن. اهڙيون رڪاوٽون يا ته پروگرام ڪوڊ يا ڪجهه هارڊويئر ڪارڪردگي جي ڪري ٿي سگهن ٿيون (مثال طور، صرف ڪيبورڊ تي چاٻيون دٻائڻ؛ ٽائمر، مثال طور، ڪمپيوٽر کي خودڪار طور تي بند ڪرڻ). مداخلت جو تعداد ھڪڙي خاص تعداد تائين محدود آھي، ھڪڙي خاص پروسيسر جي پيداوار ۾ ٺاھيو ويو آھي، اھو آھي، خاص ڪميونيڪيشن "چينل" ھن لاء مختص ڪيا ويا آھن، توھان کي ٻين سڀني عملن کي ختم ڪندي پروسيسر تائين رسائي جي اجازت ڏئي ٿي. مداخلتون پڻ خودڪار طور تي ٺاهيا ويندا آهن جڏهن هڪ نقص عمل ڪندڙ پروگرام ڪوڊ ۾ ٿئي ٿي (مثال طور، جيڪڏهن صفر طرفان ڊويزن ٿئي ٿي). اهڙين مداخلتن کي روايتي طور تي ٽريپ يا استثنا سڏيو ويندو آهي . اهڙين حالتن ۾، اهو چوڻ جو رواج آهي ته: "استثنيٰ اڇلائي وئي،" يعني، هڪ استثنا شروع ڪيو ويو يا هڪ استثنا اڇلايو ويو (ڇڏي ويو)، اهو آهي، هڪ مداخلت جي درخواستسوال سان "ڇا ڪجي؟" پروسيسر ڏانهن موڪليو ويو. هن وقت، پروسيسر ڪم ڪرڻ بند ڪري ٿو، انهي نقطي کي ياد ڪندي جنهن تي اهو روڪيو ويو آهي، يا بلڪه ايندڙ سيل جو ڪلستر، جنهن مان معلومات کي عمل ڪرڻ گهرجي. ھدايتن تي عمل ٿيل ۽ نه ٿيل ھدايتن جو سڄو سلسلو ياد آھي. ان کان پوء، پروسيسر اهڙي غلطي جي صورت ۾ عمل لاء ميموري کان هدايتون پڙهي ٿو. هن هدايتن جي مطابق، اهو ڪجهه ڪلستر ۾ نوان قدر داخل ڪري سگهي ٿو، عملن جي ڪجهه زنجير يا نئين چڪر شامل ڪري سگهي ٿو (مثال طور، واپسي يا لوپنگ چڪر)، وغيره، اهو آهي، غلطي جي بنياد تي، اڳ ۾ رکيل هيٺيون هدايتون عمل ۾ اچن ٿيون. ڪمپيوٽر سسٽم ۾ خود ڪيترائي خودڪار مداخلتون ٺهيل هونديون آهن، جيڪي هڪ خاص وقت کان پوءِ شروع ٿينديون آهن، مثال طور، ڪمپيوٽر تي هلندڙ عملن کي ڪنٽرول ڪرڻ يا الارم سيٽ ڪرڻ، ايندڙ ٻاهرين سگنلن کي گڏ ڪرڻ، ۽ مختلف ڊيٽا ڪنورٽرز کي گڏ ڪرڻ. اهو ياد رکڻ جي قابل آهي ته مداخلت جو هڪ وڏو تعداد، ڪيترن ئي سببن لاء، سسٽم کي مڪمل طور تي "پڙهڻ" ڪري سگهي ٿو. پروگرام ڪوڊ ۾ هڪ غلطي خودڪار طريقي سان پروسيسر ۾ رڪاوٽ جو سبب بڻجندي، جنهن کي اهو مقرر ڪيل هدايتن جي مطابق عمل ڪرڻ جي ڪوشش ڪندو. پر نه سڀئي مداخلت انهن کي سنڀالڻ لاءِ ٺاهيا ويا آهن، يا اهو هڪ طريقو پيدا ڪري سگهي ٿو جيڪو اسان کي مناسب نه هجي، مثال طور، اهو صرف ايپليڪيشن کي تباهه ڪري ڇڏيندو. تنهن ڪري، پروگرامنگ ۾، اهو ممڪن آهي ته توهان جي پنهنجي مداخلت کي ترتيب ڏيو ڪوڊ جي هڪ خاص حصي لاءِ جنهن ۾ پروگرامر ممڪن طور تي غلطي جو امڪان ڏسي ٿو. انهي صورت ۾، غلطي پروگرام جي اندر پروسيس ڪئي ويندي ۽ پروسيسنگ جي هدايتن لاء پروسيسر سان رابطو نه ڪندو. اهڙين بلاڪن جي تعريف کي ترتيب ڏيندي ترتيب ڏني وئي آهي "استثنائي" اعتراض . هي اعتراض خود بخود بلاڪ ۾ ٺهيل آهي try-catch. بلاڪ >tryهڪ غلطي جي موجودگي لاء چيڪ ڪيو ويو آهي ۽، جيڪڏهن اتي هڪ آهي، پروگرام بلاڪ ڏانهن وڃي ٿو catch، جتي غلطي کي روڪڻ يا سطح تي عمل ڪيو وڃي ٿو. مثال طور، جيڪڏهن اسان ڪيبورڊ مان نمبر داخل ڪريون ٿا ، جن کي بعد ۾ شامل ۽ گھٽائڻو پوندو، پوءِ ڪيبورڊ مان خط داخل ڪرڻ سان انهن کي نمبرن سان شامل ڪرڻ ناممڪن ٿي ويندو (اچو ته انهن ٻن متغيرن جو مجموعو اکر S ذريعي ظاهر ڪريون). تنهن ڪري، هڪ ٽيم جي حيثيت سان، tryاسان کي اهو ڏسڻ گهرجي ته ڇا نمبر A، نمبرن تي مشتمل آهي، نمبر B ۾ شامل ڪري سگهجي ٿو، جنهن ۾ خط شامل آهن (يعني، S = A + B)، ۽ جيڪڏهن اهو ممڪن ناهي، ۽ اهو ناممڪن آهي، پوء يقين آهي. اپاءَ وٺڻ گهرجن ته جيئن غلطيون نه ٿيون ٿين ۽ سوال سان گڏ هڪ نئون مداخلت “ڇا ڪجي؟” پروسيسر ڏانهن نه ويو. جيڪڏهن پروگرام ۾ ڪابه استثنا نه آهي، ان جي عمل کي پروسيسر طرفان مداخلت ڪئي ويندي. جيڪڏهن ڪو استثنا آهي، جڏهن اهو "پڪڙجي" حڪم سان try، ڪنٽرول پاس ڪري ٿو ڪمانڊ catch، جيڪو هڪ متبادل حل مقرر ڪري سگهي ٿو، مثال طور، اسين اهي ٻه نمبر شامل نه ڪنداسين، پر S = A مقرر ڪنداسين.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* تار "int r = 1؛" عمل نه ڪيو ويو آهي ڇاڪاڻ ته هڪ غلطي ٿي وئي آهي ۽ پروگرام سڌو ڪم کي ريڊائريڪٽ ڪري ٿو استثنا هينڊلر ڏانهن (ڪيچ بلاڪ*/ اهڙيء طرح، استثناء جي موجودگي هڪ موقعو آهي پروگرام جي اندر مسئلي کي حل ڪرڻ جو بغير پروسيسر جي سطح تي اڇلائي. "استثناء" اعتراض، جيڪو خودڪار طور تي بلاڪ ۾ ٺاھيو ويندو آھي tryجڏھن ھڪڙي غلطي معلوم ٿئي ٿي، نقص جي قسم جي قيمت تي مشتمل آھي. اچو ته ان کي سڏين ”اسان جو استثنا“ - اسان جي مخصوص ڪيس لاءِ اسان جي مخصوص غلطي جي وضاحت سان. جاوا ٻوليءَ جي ٺاهيندڙن اڳ ۾ ئي عام غلطين جي هڪ خاص فهرست ٺاهي آهي ۽ انهن کي درست ڪرڻ لاءِ عام آپشنز، يعني جاوا ۾ استثناءَ جي هڪ خاص لائبريري آهي ، جنهن کي اسان ڪنهن به غلطي کي سنڀالڻ لاءِ رخ ڪري سگهون ٿا، ته جيئن پروسيسنگ ڪوڊ پاڻ نه لکڻ لاءِ ۽ تنهن ڪري اسان جو استثنا گهڻو ڪري ممڪن آهي ته اڳ ۾ ئي ڪنهن کي بيان ڪيو ويو آهي، تنهنڪري اسان کي صرف اهو ڄاڻڻ گهرجي ته انهن استثنان مان ڪهڙن جو نالو اسان جي پروگرام ۾ داخل ڪيو وڃي ڪوڊ کي سنڀالڻ لاءِ جتي ناڪامي ٿي سگهي ٿي. جيڪڏهن اسان غلطي ڪريون ٿا ۽ لائبريري مان هڪ غلط استثنا چونڊيو ته پوءِ هينڊلر ان کي ”پڪڙ“ نه سگهندو، غلطي پروگرام ۾ حل نه ملندي ۽ درخواست پروسيسر ڏانهن موڪلي ويندي. پر سست لاء هڪ طريقو آهي. جيڪڏهن اسان لئبرريءَ مان گهربل استثناءَ جو نالو نه ٿا ڄاڻون، ته پوءِ اسين عام کي وٺي سگهون ٿا ” استثناء “ جي نالي سان، جيئن مٿي بيان ڪيل مثال ۾. هي استثنا ڪنهن به قسم جي غلطي کي سنڀالڻ جي قابل آهي، پر اهو ان واقعي جي باري ۾ مخصوص معلومات مهيا ڪرڻ جي قابل ناهي جيڪو اسان لاگ ان ڪري سگهون ٿا. اڳ ۾ لکيل استثنان جي لائبريري چيڪ ٿيل ۽ غير چيڪ ٿيل استثنان تي مشتمل آهي . چيڪ ڪرڻ وارا اهي آهن جيڪي پروگرام جي ڪم ۾ مداخلت ڪرڻ کان سواء درست ٿي سگهن ٿيون، اهو آهي، جيڪڏهن اسان ڪنهن فولڊر ۾ فائل کولڻ جي ڪوشش ڪندا آهيون جنهن ۾ اهو موجود ناهي، سسٽم اسان کي ان بابت ٻڌائيندو، اسان فائل کي ڇڏي ڏيو. مطلوب فولڊر ۾ وڃو ۽ پروگرام جاري رکو. اهو آهي، حقيقت ۾، مداخلت لاء هڪ درخواست پروسيسر ڏانهن موڪليو ويو ، پر سوال کان سواء: "ڏسو ته هن مسئلي بابت ڇا ڪجي؟!؟!" اسان هڪ وقفو موڪليو، جنهن کي اسان پاڻ پتو لڳايو، تيار ڪيل هدايتن سان، جنهن کي پروسيسر پروسيس ڪيو ۽ پروگرام کي جاري رکڻ جاري رکي. اڻ چيڪ ٿيل اهي غلطيون آهن جيڪي درست نه ٿيون ڪري سگھجن ۽ پروگرام مڪمل ٿيڻ کان اڳ بند ڪيو ويندو، يعني هڪ مداخلت جي درخواست پروسيسر ڏانهن موڪلي ويندي.، جيڪو ڪنهن به صورت ۾ پروگرام جي عمل ۾ مداخلت ڪندو. پروگرام ۾ اهڙن استثنان کي لکڻ جو واحد نقطو اهو آهي ته صارف کي اهو سمجهڻ ڏيو ته ڇا ٿيو آهي، ڇاڪاڻ ته، هن رڪاوٽ کي پڪڙڻ کان پوء، اسان اسڪرين تي هڪ معلوماتي پيغام ڏيکاري سگهون ٿا، جنهن جي ڪري پروگرام خراب ٿي ويو آهي. اهڙين رڪاوٽن کي پڪڙڻ جو ٻيو سبب اهو آهي ته انهن کي ايندڙ تجزيي لاءِ لاگن ۾ رڪارڊ ڪرڻ جي صلاحيت (توهان کي هيڪ ڪيو ويو، پر گهٽ ۾ گهٽ توهان کي خبر آهي ته ڪٿي). اهڙين لائبريرين جي موجودگي جو نتيجو اهو آهي ته انهن کي شامل ڪرڻ لاء ياد رکڻ جي ضرورت آهي. (لائبرريءَ سان چيڪ ٿيل ۽ اڻ چيڪ ٿيل استثناءَ جي لسٽ ملي سگھي ٿي، مثال طور، هتي ) جيڪڏهن اسان کي خبر ناهي ته ڪهڙي لائبريريءَ کي شامل ڪيو وڃي يا اتي ڪيترائي غلطي جا آپشن آهن، ته پوءِ اسين catchگهربل استثناءَ کي ڪيترن ۾ لسٽ ڪري سگهون ٿا. سسٽم پاڻ کي صحيح هينڊلر چونڊيندو جيڪڏهن اهو فهرست ۾ آهي. هڪ مخصوص استثنا جي بدران ، توهان لکي سگهو ٿا هڪ عام " استثناء " جيڪو ڪنهن به قسم جي استثنا کي سنڀالي سگهي ٿو جيڪڏهن اهو اڳئين بلاڪ ۾ پروسيس نه ڪيو ويو هو.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
جيڪڏهن ڪو بلاڪ آهي، tryهڪ استثنا خودڪار طور تي ٺاهي وئي آهي. جيڪڏهن اسان کي ڪجهه وقت تي هڪ استثنا کي مجبور ڪرڻ جي ضرورت آهي ، پوء حڪم استعمال ڪيو ويندو آهي throw. اهو آهي، اسان آزاديء سان هڪ اعتراض ٺاهيندا آهيون new throw... جنهن کان پوء، پروگرام پنهنجو ڪم بند ڪري ٿو، پروسيسر ڏانهن هڪ مداخلت جي درخواست موڪلي ٿو ۽ پروگرام سيڪشن ڏانهن منتقل ڪيو ويو آهي catch، جتان اهو وڌيڪ ڪمن لاء هدايتون حاصل ڪرڻ جي ڪوشش ڪري ٿو. دستي طور هڪ استثنا ٺاهڻ سان ، اسان لائبريري مان ان جي مخصوص قسم کي بيان ڪري سگهون ٿا:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
پوء هينڊلر catchهن خاص استثنا سان هڪ بلاڪ جي ڳولا ڪندو - سڄي پروگرام ۾ ڳولا ڪريو، سڀني پاسن تي catch. Exception handling ڪمانڊ کان پوءِ throw، باقي پروگرام ڪوڊ تي عمل نه ڪيو ويندو، سواءِ ان جي جيڪو بلاڪ ۾ آهي catch. جيڪڏهن پروگرام ۾ هينڊلر نه مليو، پروسيسر کان سوال پڇيو ويو آهي: "پنهنجي لاء فيصلو ڪيو ته ڇا ڪجي" ۽ اهو پروگرام ۾ مداخلت ڪري ٿو. ڪال new throw... بلاڪ جي اندر ۽ ٻاهر ٻنهي ڪري سگهجي ٿو >try(پروگرام ۾ ڪٿي به)
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

نوٽيفڪيشن جي استثنا

طريقن ۾ اڳ ۾ ئي ڪنهن جي طرفان لکيل آهي ٿي سگھي ٿو اڇلائڻ Exceptions. صرف محفوظ پاسي تي، پروگرامر جيڪو ڪوڊ لکيو هو، بعد ۾ پروگرامرز کي خبردار ڪيو ويو آهي ته هن طريقي سان غلطي ٿي سگهي ٿي. تنهن ڪري، مثال طور، هيٺ ڏنل بيان ڪيل فائل ٺاھڻ جو طريقو بيان ڪيو ويو آھي ته فائل ٺاھڻ وقت ھڪڙي غلطي ٿي سگھي ٿي (ڏسيل رستي تي ڪا فائل نه آھي)، جنھن جو مطلب آھي ته ھڪڙي غلطي سنڀاليندڙ جي ضرورت پوندي:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
پر ساڳئي وقت، پاڻ وٽ ڪو به سنڀاليندڙ نه آهي، جنهن جو مطلب آهي ته هاڻي اسان عام موڊ ۾ اسان جي پروگرام ۾ لکيل طريقي سان ڪال ڪرڻ جي قابل نه هوندا. ھاڻي اسان کي ضرور لکڻ گھرجي ايرر ھينڊلر ۽ ھن طريقي کي بلاڪ ۾ ڪال ڪريو try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

اصلي استثنا

جيڪڏهن موجود لائبريريون اسان لاءِ ڪافي نه آهن ته ڪجهه غلطين کي سنڀالڻ لاءِ پنهنجا استثنا لکڻ ممڪن آهي. هن کي ڪرڻ لاءِ، اسان صرف هڪ ڪلاس ٺاهيون ٿا جيڪو استثنا ڪلاس مان ورثي ۾ ملي ٿو
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
ذهن ۾ رکڻ لاء ٻه قاعدا آهن جڏهن توهان جا پنهنجا استثنا ٺاهي رهيا آهن:
  1. اسان جي طبقي جو نالو ختم ٿيڻ گهرجي "استثنيٰ" سان
  2. ڪلاس ۾ لازمي طور تي ھڪڙو ٺاھيندڙ ھجڻ گھرجي جنھن ۾ اسٽرنگ متغير آھي جيڪو استثنا جي مسئلي جي تفصيل کي بيان ڪري ٿو. تعمير ڪندڙ ۾، سپر تعمير ڪندڙ کي سڏيو ويندو آهي ۽ هڪ پيغام گذري ويو آهي.
ٺاهيل استثنا استعمال ڪرڻ جو هڪ مثال:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
اسان هن استثنا کي ڪوڊ سان پڪڙيندا آهيون:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
پروگرام تي عمل ڪرڻ جو نتيجو ٿيندو: StudentNotFoundException: ID 0000001 سان شاگرد نه ملي سگهيو

توهان کي استثنا لکڻ جي ضرورت ڇو آهي؟

1996 ۾، Ariane 5 راڪيٽ هڪ انٽيجر ويريبل ۾ فلوٽ ويريبل جي غلط تبديليءَ سبب ڪري تباهه ٿي ويو. هن صورتحال لاءِ ڪو به استثنا يا سنڀاليندڙ نه هئا. جيڪڏهن فائل ڊائون لوڊ ڪرڻ دوران انٽرنيٽ سان ڪنيڪشن جو نقصان آهي، ته پوء هڪ استثنا جي موجودگي توهان کي ڪنيڪشن بحال ٿيڻ کان پوء ڊائون لوڊ جاري رکڻ جي اجازت ڏيندو. جيڪڏهن ڪو به استثنا نه آهي، ڊائون لوڊ ٻيهر شروع ڪرڻو پوندو.

حوالا:

تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION