سلام اڄ اسان جاوا ۾ استثناء جي سنڀال تي هڪ ويجهي نظر ڪنداسين. مون کي ان جو ذڪر ڪرڻ کان نفرت آهي، پر پروگرامر جي ڪم جو هڪ وڏو حصو غلطين سان معاملو آهي. گهڻو ڪري، هن جي پنهنجي. اهو ظاهر ٿئي ٿو ته اهڙا ماڻهو نه آهن جيڪي غلطي نه ڪندا آهن. ۽ نه ته اهڙا پروگرام آهن. يقينا، جڏهن غلطي سان معاملو ڪرڻ، بنيادي شيء ان جي سبب کي سمجهڻ آهي. ۽ ڪيتريون ئي شيون پروگرام ۾ بگ پيدا ڪري سگھن ٿيون. ڪجهه نقطي تي، جاوا جي تخليق ڪندڙ پاڻ کان پڇيو ته سڀ کان وڌيڪ ممڪن پروگرامنگ غلطي سان ڇا ڪيو وڃي؟ مڪمل طور تي انهن کان بچڻ حقيقي نه آهي، پروگرامر مواد لکڻ جي قابل آهن جيڪي توهان تصور به نٿا ڪري سگهو. :) تنهن ڪري، اسان کي ضرورت آهي ته ٻوليءَ کي غلطين سان ڪم ڪرڻ لاءِ هڪ ميکانيزم ڏيو. ٻين لفظن ۾، جيڪڏھن توھان جي پروگرام ۾ ڪا نقص آھي، توھان کي ڪجھھ قسم جي اسڪرپٽ جي ضرورت آھي اڳتي ڇا ڪجي. جڏهن ڪا غلطي ٿئي ٿي ته پروگرام کي ڇا ڪرڻ گهرجي؟ اڄ اسان هن ميڪانيزم سان واقف ٿي ويندا. ان کي " جاوا ۾ استثنا
" سڏيو ويندو آهي.
ڇا هڪ استثنا آهي؟
هڪ استثنا هڪ غير معمولي، غير منصوبابندي واري صورتحال آهي جيڪا ٿئي ٿي جڏهن هڪ پروگرام هلندي آهي. اهڙا ڪيترائي استثنا آهن. مثال طور، توهان ڪوڊ لکيو آهي جيڪو فائل مان ٽيڪسٽ پڙهي ٿو، ۽ پهرين لائن ڏيکاري ٿو.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 عناصر آهن.
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
, catch
and finally
. ڪوڊ جتي پروگرامر کي يقين آهي ته هڪ استثنا ٿي سگهي ٿي 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();
}
}
}
هاڻي اسان کي پڪ آهي ته اسان وسيلن جو خيال رکنداسين، قطع نظر ته جڏهن پروگرام هلي رهيو آهي ته ڇا ٿئي. :) اهو سڀ ڪجهه نه آهي توهان کي استثنا بابت ڄاڻڻ جي ضرورت آهي. پروگرامنگ ۾ ايرر سنڀالڻ هڪ سپر اهم موضوع آهي. ڪيترائي مضمون ان لاءِ وقف ٿيل آهن. ايندڙ سبق ۾، اسان معلوم ڪنداسين ته ڪهڙي قسم جا استثنا آهن ۽ ڪيئن پنهنجون استثنا پيدا ڪرڻ. :) پوءِ ملنداسين!
وڌيڪ پڙهڻ: |
---|
GO TO FULL VERSION