JavaRush /جاوا بلاگ /Random-UR /جاوا میں مستثنیات
Roman
سطح

جاوا میں مستثنیات

گروپ میں شائع ہوا۔
جب میں "استثنیات" کے موضوع پر آیا تو بہت سے سوالات نے جنم لیا جن کے جوابات مجھے انٹرنیٹ کے مختلف گوشوں میں تلاش کرنے پڑے تاکہ یہ تفصیل سے سمجھ سکیں کہ یہ سب کیسے کام کرتا ہے۔ نتیجے کے طور پر، میں نے خود اپنی وضاحت مرتب کی ہے، جو ان ابتدائیوں کے لیے زیادہ قابل فہم ہو سکتی ہے جنہوں نے ابھی اس رجحان کا سامنا کیا ہے۔ جاوا میں مستثنیات - 1کمپیوٹرز میں، ایک مداخلت پروسیسر کو آنے والا ایک سگنل ہے کہ ایک واقعہ پیش آرہا ہے جس کے لیے فوری ردعمل کی ضرورت ہوتی ہے۔ ایک انٹرپٹ سگنل کے لیے پروسیسر کو چلنے والے پروگرام کو روکنے کی ضرورت ہوتی ہے تاکہ اسے تھوڑی دیر بعد جاری رکھا جا سکے، یعنی کمپیوٹر کو پروگرام کے عمل سے منسلک تمام معلومات کو یاد رکھنا چاہیے۔ اس طرح کی رکاوٹیں عارضی ہیں، اگر مہلک نہیں ہیں۔ اس طرح کی رکاوٹیں یا تو پروگرام کوڈ کی وجہ سے یا کچھ ہارڈ ویئر کی فعالیت کی وجہ سے ہوسکتی ہیں (مثال کے طور پر، کی بورڈ پر صرف چابیاں دبانا؛ ٹائمر، مثال کے طور پر، کمپیوٹر کو خود بخود بند کرنے کے لیے)۔ مداخلتوں کی تعداد ایک مخصوص تعداد تک محدود ہے، جو کہ ایک خاص پروسیسر کی تیاری میں بنی ہوئی ہے، یعنی اس کے لیے خصوصی مواصلاتی "چینلز" مختص کیے گئے ہیں، جس سے آپ تمام دیگر عملوں کو نظرانداز کرتے ہوئے پروسیسر تک رسائی حاصل کر سکتے ہیں۔ جب ایگزیکیوٹنگ پروگرام کوڈ میں کوئی خرابی واقع ہوتی ہے تو مداخلتیں بھی خود بخود پیدا ہوجاتی ہیں (مثال کے طور پر، اگر صفر سے تقسیم ہوتی ہے)۔ اس طرح کی رکاوٹوں کو روایتی طور پر جال یا استثناء کہا جاتا ہے ۔ ایسے معاملات میں، یہ کہنا رواج ہے: "استثنیٰ پھینک دیا گیا تھا،" یعنی، ایک استثناء کو متحرک کیا گیا تھا یا ایک استثناء پھینک دیا گیا تھا (پھینک دیا گیا تھا)، یعنی مداخلت کی درخواستسوال کے ساتھ "کیا کرنا ہے؟" پروسیسر کو بھیجا گیا۔ اس وقت، پروسیسر کام کرنا چھوڑ دیتا ہے، اس نقطہ کو یاد رکھتا ہے جس پر یہ رکا تھا، یا اس کے بجائے اگلے سیل کا کلسٹر، جس سے معلومات کو عمل میں لایا جانا چاہیے۔ پھانسی دی گئی اور نہ عمل میں لائی گئی ہدایات کا پورا سلسلہ یاد ہے۔ اس کے بعد، پروسیسر ایسی غلطی کی صورت میں کارروائی کے لیے میموری سے ہدایات پڑھتا ہے۔ اس ہدایت کے مطابق، یہ کچھ مخصوص کلسٹرز میں نئی ​​قدریں داخل کر سکتا ہے، اعمال کی کچھ زنجیریں یا ایک نیا سائیکل (مثال کے طور پر واپسی یا لوپنگ سائیکل) شامل کر سکتا ہے، یعنی غلطی پر منحصر ہے، جو پہلے رکھی گئی تھی۔ نیچے کی ہدایات پر عمل کیا جاتا ہے۔ کمپیوٹر سسٹم میں خود بخود کئی خودکار انٹراپٹس بنائے گئے ہیں، جو ایک خاص وقت کے بعد متحرک ہو جاتے ہیں، مثلاً کمپیوٹر پر چلنے والے عمل کو کنٹرول کرنا یا سیٹ الارم چلانا، آنے والے بیرونی سگنلز اور مختلف ڈیٹا کنورٹرز کو جمع کرنا۔ یہ یاد رکھنے کے قابل ہے کہ مداخلت کی ایک بڑی تعداد، متعدد وجوہات کی بناء پر، سسٹم کو مکمل طور پر "ہنگ" کر سکتی ہے۔ پروگرام کوڈ میں خرابی خود بخود پروسیسر میں رکاوٹ پیدا کر دے گی، جس پر وہ دی گئی ہدایات کے مطابق کارروائی کرنے کی کوشش کرے گا۔ لیکن تمام رکاوٹوں کو ان کو سنبھالنے کے لیے ڈیزائن نہیں کیا گیا ہے، یا یہ ایسا طریقہ کار پیدا کر سکتا ہے جو ہمارے موافق نہیں ہے، مثال کے طور پر، یہ صرف ایپلیکیشن کو کریش کر دے گا۔ اس لیے، پروگرامنگ میں، کوڈ کے ایک مخصوص حصے کے لیے آپ کی اپنی مداخلت کو منظم کرنا ممکن ہے جس میں پروگرامر ممکنہ طور پر غلطی کا امکان دیکھتا ہے۔ اس صورت میں، پروگرام کے اندر غلطی پر کارروائی کی جائے گی اور پروسیسنگ ہدایات کے لیے پروسیسر سے رابطہ نہیں کیا جائے گا۔ اس طرح کے بلاکس کی تعریف ایک "Exception" آبجیکٹ بنا کر ترتیب دی جاتی ہے ۔ یہ آبجیکٹ بلاک میں خود بخود بن جاتا ہے 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؛" اس پر عمل درآمد نہیں کیا جاتا ہے کیونکہ ایک خرابی واقع ہوئی ہے اور پروگرام کام کو براہ راست استثنا ہینڈلر پر بھیج دیتا ہے (کیچ بلاک*/ اس طرح، Exceptions کی موجودگی پروگرام کے اندر مسئلے کو پروسیسر کی سطح پر پھینکے بغیر حل کرنے کا ایک موقع ہے۔ "استثنیٰ" آبجیکٹ، جو tryغلطی کا پتہ چلنے پر بلاک میں خود بخود بن جاتا ہے، اس میں غلطی کی قسم کی قدر ہوتی ہے۔ آئیے اسے "OurException" کہتے ہیں - ہماری مخصوص غلطی کی وضاحت کے ساتھ ہمارے مخصوص معاملے کے لیے۔ جاوا زبان کے تخلیق کاروں نے پہلے سے مخصوص غلطیوں کی ایک مخصوص فہرست اور ان کو درست کرنے کے لیے مخصوص اختیارات تیار کیے ہیں، یعنی جاوا میں Exceptions کی ایک خاص لائبریری ہے ، جس سے ہم کسی غلطی کو سنبھالنے کے لیے رجوع کر سکتے ہیں، تاکہ پروسیسنگ کوڈ خود نہ لکھیں اور اس وجہ سے OurException غالباً پہلے ہی کسی کو بیان کیا جا چکا ہے، اس لیے ہمیں صرف یہ جاننے کی ضرورت ہے کہ ان میں سے کون سے استثناء کوڈ کو ہینڈل کرنے کے لیے اپنے پروگرام میں داخل کرنا ہے جہاں ممکنہ طور پر ناکامی ہو سکتی ہے۔ اگر ہم غلطی کرتے ہیں اور لائبریری سے ایک غلط استثناء کا انتخاب کرتے ہیں، تو ہینڈلر اسے "کیچ" نہیں کرے گا، پروگرام میں غلطی کا حل نہیں ملے گا اور درخواست پروسیسر کو بھیج دی جائے گی۔ لیکن سست کے لئے ایک راستہ ہے. اگر ہمیں لائبریری سے مطلوبہ استثنیٰ کا نام معلوم نہیں ہے، تو ہم عام کو " استثناء " کے نام سے لے سکتے ہیں، جیسا کہ اوپر بیان کی گئی مثال میں ہے۔ یہ استثناء کسی بھی قسم کی غلطی سے نمٹنے کے قابل ہے، لیکن یہ اس واقعے کے بارے میں مخصوص معلومات فراہم کرنے کے قابل نہیں ہے جسے ہم لاگ ان کر سکتے ہیں۔ پہلے لکھے گئے Exceptions کی لائبریری چیک شدہ اور غیر چیک شدہ Exceptions پر مشتمل ہوتی ہے ۔ چیک ایبل وہ ہوتے ہیں جن کو پروگرام کے کام میں رکاوٹ ڈالے بغیر درست کیا جاسکتا ہے، یعنی اگر ہم کسی ایسے فولڈر میں فائل کھولنے کی کوشش کریں جس میں وہ موجود نہ ہو تو سسٹم ہمیں اس کے بارے میں بتائے گا، ہم فائل کو چھوڑ سکتے ہیں۔ مطلوبہ فولڈر میں جائیں اور پروگرام کو جاری رکھیں۔ یعنی، درحقیقت، پروسیسر کو مداخلت کی درخواست بھیجی گئی تھی ، لیکن اس سوال کے بغیر: "دیکھو اس مسئلے کے بارے میں کیا کرنا ہے؟!؟!" ہم نے ایک انٹرپٹ بھیجا، جس کا ہم نے خود پتہ چلا، ایک تیار شدہ ہدایات کے ساتھ، جس پر پروسیسر نے کارروائی کی اور پروگرام کو جاری رکھا۔ وہ غلطیاں ہیں جن کو درست نہیں کیا جا سکتا اور پروگرام مکمل ہونے سے پہلے بند کر دیا جائے گا، یعنی پروسیسر کو ایک مداخلت کی درخواست بھیجی جائے گی۔، جو کسی بھی صورت میں پروگرام کے نفاذ میں خلل ڈالے گا۔ پروگرام میں اس طرح کے مستثنیات کو لکھنے کا واحد نکتہ یہ ہے کہ صارف کو یہ سمجھنے دیا جائے کہ کیا ہوا ہے، کیونکہ اس رکاوٹ کو پکڑنے کے بعد، ہم اسکرین پر ایک معلوماتی پیغام ڈسپلے کر سکتے ہیں جس کی وجہ سے پروگرام کریش ہو گیا ہے۔ اس طرح کی رکاوٹوں کو پکڑنے کی دوسری وجہ بعد کے تجزیے کے لیے انہیں لاگز میں ریکارڈ کرنے کی صلاحیت ہے (آپ کو ہیک کیا گیا تھا، لیکن کم از کم آپ کو معلوم ہے کہ کہاں)۔ اس طرح کے کتب خانوں کی موجودگی کا نتیجہ یہ ہے کہ انہیں شامل کرنا یاد رکھنے کی ضرورت ہے۔ (لائبریریوں کے ساتھ چیک شدہ اور غیر چیک شدہ مستثنیات کی ایک فہرست مل سکتی ہے، مثال کے طور پر، یہاں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ایک استثناء خود بخود بن جاتا ہے۔ اگر ہمیں کسی وقت کسی Exception کو مجبور کرنے کی ضرورت ہو تو کمانڈ استعمال کی جاتی ہے throw۔ یعنی، ہم آزادانہ طور پر ایک آبجیکٹ بناتے ہیں new throw... جس کے بعد، پروگرام اپنا کام روک دیتا ہے، پروسیسر کو مداخلت کی درخواست بھیجتا ہے اور پروگرام کے سیکشن میں منتقل ہو جاتا ہے catch، جہاں سے وہ مزید کارروائیوں کے لیے ہدایات حاصل کرنے کی کوشش کرتا ہے۔ دستی طور پر ایک استثناء بنا کر ، ہم لائبریری سے اس کی مخصوص قسم کی وضاحت کر سکتے ہیں:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
پھر ہینڈلر catchاس مخصوص استثناء کے ساتھ ایک بلاک تلاش کرے گا - پورے پروگرام میں تلاش کریں، ہر طرف catch۔ Exception ہینڈلنگ کمانڈ کے بعد 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 другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

مستثنیات کی اطلاع

کسی کے ذریعہ پہلے لکھے گئے طریقوں میں استثناء پھینکنا شامل ہوسکتا ہے۔ صرف محفوظ پہلو پر رہنے کے لیے، پروگرامر جس نے کوڈ لکھا تھا بعد کے پروگرامرز کو متنبہ کیا کہ اس کے لکھے ہوئے طریقہ میں غلطی ہو سکتی ہے۔ لہذا، مثال کے طور پر، ذیل میں بیان کردہ فائل بنانے کا طریقہ یہ بتاتا ہے کہ فائل بناتے وقت ایک غلطی ہو سکتی ہے (دیئے گئے راستے پر کوئی فائل نہیں ہے)، جس کا مطلب ہے کہ ایک ایرر ہینڈلر کی ضرورت ہوگی:
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);
}

مقامی مستثنیات

اگر موجودہ لائبریریاں ہمارے لیے کافی نہیں ہیں تو بعض غلطیوں کو سنبھالنے کے لیے اپنی مستثنیات لکھنا ممکن ہے۔ ایسا کرنے کے لیے، ہم صرف ایک کلاس بناتے ہیں جو Exception کلاس سے وراثت میں ملتی ہے۔
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
آپ کے اپنے استثناء تخلیق کرتے وقت ذہن میں رکھنے کے لئے دو اصول ہیں:
  1. ہماری کلاس کا نام "استثنیٰ" کے ساتھ ختم ہونا چاہیے۔
  2. کلاس میں ایک کنسٹرکٹر ہونا چاہیے جس میں سٹرنگ متغیر ہو جو Exception مسئلہ کی تفصیلات بیان کرے۔ کنسٹرکٹر میں، سپر کنسٹرکٹر کو بلایا جاتا ہے اور ایک پیغام پاس کیا جاتا ہے۔
پیدا شدہ استثناء کو استعمال کرنے کی ایک مثال:
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 والا طالب علم نہیں مل سکا

آپ کو Exceptions لکھنے کی ضرورت کیوں ہے؟

1996 میں، Ariane 5 راکٹ فلوٹ متغیر کے ایک عدد متغیر میں غلط تبدیلی کی وجہ سے گر کر تباہ ہو گیا۔ اس صورتحال کے لیے کوئی مستثنیات یا ہینڈلر نہیں تھے۔ اگر فائل ڈاؤن لوڈ کرتے وقت انٹرنیٹ سے کنکشن کا نقصان ہو جاتا ہے، تو ایک استثناء کی موجودگی آپ کو کنکشن بحال ہونے کے بعد ڈاؤن لوڈ جاری رکھنے کی اجازت دے گی۔ اگر کوئی استثناء نہیں ہے تو، ڈاؤن لوڈ دوبارہ شروع کرنا پڑے گا.

حوالہ جات:

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