JavaRush /جاوا بلاگ /Random-UR /جاوا میں مستثنیات (جاوا استثناء)

جاوا میں مستثنیات (جاوا استثناء)

گروپ میں شائع ہوا۔
روزمرہ کی زندگی میں، بعض اوقات ایسے حالات پیدا ہوتے ہیں جن کے لیے ہم نے منصوبہ بندی نہیں کی تھی۔ مثال کے طور پر، آپ صبح کام کے لیے اٹھتے ہیں، اپنے فون کے لیے چارجر تلاش کرتے ہیں، لیکن ایک بھی نہیں ہے۔ آپ اپنا چہرہ دھونے باتھ روم جائیں - پانی بند کر دیا گیا ہے۔ میں گاڑی میں بیٹھ گیا اور یہ اسٹارٹ نہیں ہوگی۔ لیکن ایک شخص اس طرح کے غیر متوقع حالات کا مقابلہ آسانی سے کر سکتا ہے۔ ہم اس مضمون میں یہ جاننے کی کوشش کریں گے کہ جاوا پروگرام ان کے ساتھ کیسے نمٹتے ہیں۔

جاوا مستثنیات کیا ہیں؟

پروگرامنگ کی دنیا میں، پروگرام پر عمل درآمد کے دوران غلطیوں اور غیر متوقع حالات کے رونما ہونے کو ایک استثناء کہا جاتا ہے۔ ایک پروگرام میں، مستثنیات صارف کے غلط اقدامات، ڈسک پر ضروری وسائل کی کمی، یا نیٹ ورک پر سرور سے کنکشن کے کھو جانے کے نتیجے میں ہو سکتی ہیں۔ پروگرام کے عمل کے دوران مستثنیات پروگرامنگ کی غلطیوں یا API کے غلط استعمال کی وجہ سے بھی ہو سکتی ہیں۔ ہماری دنیا کے برعکس، پروگرام کو واضح طور پر معلوم ہونا چاہیے کہ ایسی صورت حال میں کیا کرنا ہے۔ جاوا اس مقصد کے لیے ایک استثنائی طریقہ کار فراہم کرتا ہے۔

مطلوبہ الفاظ کے بارے میں مختصراً کوشش کریں، پکڑیں، آخر میں، پھینک دیں۔

جاوا میں استثنیٰ ہینڈلنگ پروگرام میں درج ذیل کلیدی الفاظ کے استعمال پر مبنی ہے:
  • try - کوڈ کے ایک بلاک کی وضاحت کرتا ہے جس میں ایک استثناء ہو سکتا ہے؛
  • catch - کوڈ کے بلاک کی وضاحت کرتا ہے جس میں استثناء کو سنبھالا جاتا ہے۔
  • آخر میں - کوڈ کے ایک بلاک کی وضاحت کرتا ہے جو اختیاری ہے، لیکن اگر موجود ہے تو، بہرحال عمل میں لایا جاتا ہے، قطع نظر کوشش کے بلاک کے نتائج۔
یہ کلیدی الفاظ پروگرام کوڈ میں خصوصی پروسیسنگ کنسٹرکٹس بنانے کے لیے استعمال ہوتے ہیں: کوشش کریں{}پکڑیں، کوشش کریں{}پکڑیں{}آخر میں، کوشش کریں{}آخر میں{}۔
  • پھینکنا - ایک استثنا کو بڑھانے کے لئے استعمال کیا جاتا ہے؛
  • تھرو - طریقہ کار کے دستخطوں میں استعمال کیا جاتا ہے تاکہ متنبہ کیا جا سکے کہ کوئی طریقہ مستثنیٰ ہو سکتا ہے۔
جاوا پروگرام میں مطلوبہ الفاظ کے استعمال کی ایک مثال:
//method reads a string from the keyboard

public String input() throws MyException {//warn with throws,
// that the method can throw MyException
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String s = null;
// in the try block we enclose the code in which an exception can occur, in this
// if the compiler tells us that the readLine() method of the class
// BufferedReader may throw an I/O exception
    try {
        s = reader.readLine();
// in the catch block we enclose the code for handling the IOException exception
    } catch (IOException e) {
        System.out.println(e.getMessage());
// close the read stream in the finally block
    } finally {
// when closing the stream, an exception is also possible, for example, if it was not opened, so we “wrap” the code in a try block
        try {
            reader.close();
// write exception handling when closing the read stream
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    if (s.equals("")) {
// we decided that an empty string could disrupt the work of our program in the future, for example, on the result of this method, we need to call the substring(1,2) method, so we are forced to interrupt the program execution with the generation of our exception type MyException using throw
        throw new MyException("String can not be empty!");
    }
    return s;
}

ہمیں ایک استثنائی طریقہ کار کی ضرورت کیوں ہے؟

آئیے ایک حقیقی دنیا کی مثال دیکھیں۔ تصور کریں کہ ایک ہائی وے پر ایک سیکشن ہے جس میں ایک ہنگامی پل ہے جس میں بوجھ کی محدود گنجائش ہے۔ اگر پل کی گنجائش سے زیادہ وزن والی گاڑی اس کے پار چلتی ہے، تو وہ گر سکتی ہے، اور ڈرائیور کے لیے صورت حال ہلکی سے، غیر معمولی ہو سکتی ہے۔ ایسا ہونے سے روکنے کے لیے، روڈ سروس سڑک پر پہلے سے انتباہی نشانات لگا دیتی ہے۔ کار کا ڈرائیور، انتباہی نشان کو دیکھ کر، اپنی گاڑی کے وزن کا موازنہ پل پر گاڑی چلانے کی اجازت سے کرے گا۔ اگر یہ اس سے بڑھ جائے تو وہ ایک چکر لگائے گا۔ روڈ سروس کے اقدامات کی بدولت، ٹرک ڈرائیوروں کو، سب سے پہلے، اپنا راستہ پہلے سے تبدیل کرنے کا موقع دیا گیا، دوسرا، انہیں مرکزی راستے پر خطرے کے بارے میں خبردار کیا گیا، اور آخر میں، انہیں استعمال کرنے کے ناممکن ہونے کے بارے میں خبردار کیا گیا۔ کچھ شرائط کے تحت پل.
Исключения в Java - 2
کسی پروگرام میں استثنیٰ کو روکنے اور اسے حل کرنے کی صلاحیت تاکہ یہ جاری رہ سکے جاوا میں مستثنیات کو استعمال کرنے کی ایک وجہ ہے۔ استثنیٰ کا طریقہ کار آپ کو اس کوڈ (پروگرامنگ انٹرفیس) کو صارف کے ذریعے آنے والے ڈیٹا کی توثیق (چیکنگ) کے غلط استعمال سے بچانے کی بھی اجازت دیتا ہے۔ اب ایک سیکنڈ کے لیے ٹریفک پولیس بنیں۔ سب سے پہلے، آپ کو ان جگہوں کا پتہ ہونا چاہیے جہاں گاڑی چلانے والوں کو پریشانی ہو سکتی ہے۔ دوم، آپ کو انتباہی نشانیاں تیار کرنے اور انسٹال کرنے کی ضرورت ہے۔ آخر میں، آپ کو مرکزی راستے پر خطرے کی صورت میں چکر کا راستہ فراہم کرنے کی ضرورت ہے۔ جاوا میں، استثنائی طریقہ کار اسی طرح کام کرتا ہے۔ پروگرام کی ترقی کے مرحلے پر، ہم کوشش{} بلاک کا استعمال کرتے ہوئے کوڈ کے خطرناک حصوں کو مستثنیات سے "محفوظ" کرتے ہیں، کیچ{} بلاک کا استعمال کرتے ہوئے "بیک اپ" راستے فراہم کرتے ہیں، اور آخر میں{} بلاک میں ہم کوڈ لکھتے ہیں جس پر عمل درآمد ہوتا ہے۔ کسی بھی نتیجہ کے لیے پروگرام۔ ایسے معاملات میں جہاں ہم "ہنگامی راستہ" فراہم نہیں کر سکتے یا جان بوجھ کر انتخاب صارف پر چھوڑنا چاہتے ہیں، ہمیں کم از کم اسے خطرے کے بارے میں خبردار کرنا چاہیے۔ کیوں؟ ذرا ایک ڈرائیور کے غصے کا تصور کریں جو ایک ایسے ہنگامی پل تک پہنچ جائے گا جسے راستے میں ایک بھی انتباہی نشان کا سامنا کیے بغیر نہیں پار کیا جا سکتا! پروگرامنگ میں، اپنی کلاسز اور طریقے لکھتے وقت، ہم ہمیشہ دوسرے ڈویلپرز کے پروگراموں میں ان کے استعمال کے سیاق و سباق کی پیش گوئی نہیں کر سکتے، اس لیے ہم استثنائی صورت حال کو حل کرنے کے لیے 100% درست راستے کی پیشین گوئی نہیں کر سکتے۔ ایک ہی وقت میں، ہمارے کوڈ کے بارے میں صارفین کو کسی استثنا کے امکان کے بارے میں خبردار کرنا اچھا عمل ہے۔ جاوا کا استثنیٰ میکانزم ہمیں تھرو کا استعمال کرتے ہوئے ایسا کرنے کی اجازت دیتا ہے — بنیادی طور پر ہمارے طریقہ کار کے عمومی رویے کو مستثنیٰ پھینکنے کا اعلان کرتے ہوئے، اس طرح جاوا میں استثنیٰ کو ہینڈل کرنے کے لیے کوڈ لکھنے کے لیے طریقہ کار کے صارف پر چھوڑ دیا جاتا ہے۔

"پریشانی" کی وارننگ

جب آپ اپنے طریقہ کار میں استثنیٰ کو ہینڈل کرنے کا ارادہ نہیں رکھتے ہیں، لیکن صارفین کو ممکنہ استثنائی حالات کے بارے میں اس طریقہ سے خبردار کرنا چاہتے ہیں، تو تھرو کلیدی لفظ استعمال کریں۔ طریقہ کے دستخط میں اس کلیدی لفظ کا مطلب ہے کہ کچھ شرائط کے تحت طریقہ استثناء دے سکتا ہے۔ یہ انتباہ میتھڈ انٹرفیس کا حصہ ہے اور صارف کو استثنا ہینڈلر کے نفاذ کو اپنی مرضی کے مطابق کرنے کا حق دیتا ہے۔ پھینکنے کے بعد ہم پھینکے جانے والے استثناء کی قسم کی نشاندہی کرتے ہیں۔ یہ عام طور پر Java Exception کلاس کی اولاد ہیں ۔ چونکہ جاوا ایک آبجیکٹ پر مبنی زبان ہے، اس لیے جاوا میں تمام مستثنیات آبجیکٹ ہیں۔
Исключения в Java - 3

جاوا استثنائی درجہ بندی

جب پروگرام پر عمل درآمد کے دوران کوئی خرابی واقع ہوتی ہے، تو JVM رن ٹائم جاوا استثنائی درجہ بندی سے مطلوبہ قسم کا ایک آبجیکٹ بناتا ہے - ممکنہ استثناء کا مجموعہ جو ایک مشترکہ "آباؤ اجداد" سے وراثت میں ملتا ہے - تھرو ایبل کلاس۔ پروگرام میں ہونے والے غیر معمولی حالات کو دو گروپوں میں تقسیم کیا جا سکتا ہے:
  1. ایسے حالات جن میں پروگرام کے مزید معمول کے آپریشن کی بحالی ناممکن ہے۔
  2. بحالی ممکن ہے۔
پہلے گروپ میں ایسے حالات شامل ہوتے ہیں جب ایرر کلاس سے وراثت میں مستثنیات پائے جاتے ہیں ۔ یہ وہ خرابیاں ہیں جو پروگرام کے عمل کے دوران JVM کی ناکامی، میموری اوور فلو، یا سسٹم کریش کے نتیجے میں ہوتی ہیں۔ وہ عام طور پر سنگین مسائل کی نشاندہی کرتے ہیں جنہیں سافٹ ویئر کے ذریعے حل نہیں کیا جا سکتا۔ جاوا میں اس قسم کی رعایت کو تالیف کے مرحلے پر غیر چیک شدہ کے طور پر درجہ بندی کیا جاتا ہے۔ اس گروپ میں RuntimeException - مستثنیات، Exception class کے وراثت بھی شامل ہیں، جو پروگرام کے عمل کے دوران JVM کے ذریعے تیار کیے گئے ہیں۔ وہ اکثر پروگرامنگ کی غلطیوں کی وجہ سے ہوتے ہیں۔ یہ مستثنیات مرتب کرنے کے وقت بھی غیر نشان زد ہیں، لہذا ان کو سنبھالنے کے لیے کوڈ لکھنا ضروری نہیں ہے۔ دوسرے گروپ میں غیر معمولی حالات شامل ہیں جو پروگرام لکھنے کے مرحلے پر پیش گوئی کی جاتی ہیں، اور جن کے لیے پروسیسنگ کوڈ لکھا جانا ضروری ہے۔ اس طرح کے استثناء کی جانچ پڑتال کی جاتی ہے. مستثنیات سے نمٹتے وقت جاوا ڈویلپر کا زیادہ تر کام ایسے حالات سے نمٹنا ہوتا ہے۔

استثنیٰ بنانا

پروگرام کے عمل کے دوران، JVM کی طرف سے یا دستی طور پر تھرو سٹیٹمنٹ کا استعمال کرتے ہوئے ایک استثناء دیا جاتا ہے ۔ یہ میموری میں ایک استثنیٰ آبجیکٹ بناتا ہے اور مرکزی پروگرام کوڈ پر عمل درآمد میں خلل ڈالتا ہے جبکہ JVM استثنیٰ ہینڈلر استثنا کو ہینڈل کرنے کا راستہ تلاش کرنے کی کوشش کرتا ہے۔

رعایت کی ہینڈلنگ

کوڈ بلاکس کی تخلیق جس کے لیے ہم جاوا میں استثنیٰ ہینڈلنگ فراہم کرتے ہیں اس پروگرام میں try{}catch, try{}catch{}finally, try{}finally{} constructs کا استعمال کرتے ہوئے کیا جاتا ہے۔
Исключения в Java - 4
جب ٹرائی بلاک میں ایک استثناء اٹھایا جاتا ہے تو، استثنائی ہینڈلر کو مندرجہ ذیل کیچ بلاک میں تلاش کیا جاتا ہے۔ اگر کیچ میں اس قسم کی رعایت کے لیے ایک ہینڈلر ہوتا ہے، تو کنٹرول اس کے پاس جاتا ہے۔ اگر نہیں، تو JVM اس استثنائی قسم کے لیے ایک ہینڈلر کی تلاش کرتا ہے جب تک کہ کوئی مناسب کیچ نہ مل جائے۔ کیچ بلاک کے عمل میں آنے کے بعد، کنٹرول کو اختیاری آخر میں بلاک میں منتقل کیا جاتا ہے ۔ اگر کوئی مناسب کیچ بلاک نہیں ملتا ہے، تو JVM پروگرام پر عمل درآمد روک دیتا ہے اور میتھڈ کالز کا ایک ڈھیر دکھاتا ہے - stack trace ، اگر موجود ہو تو، اس سے پہلے آخر میں بلاک کوڈ پر عمل درآمد کر چکا ہے۔ استثنیٰ ہینڈلنگ کی مثال:
public class Print {

     void print(String s) {
        if (s == null) {
            throw new NullPointerException("Exception: s is null!");
        }
        System.out.println("Inside method print: " + s);
    }

    public static void main(String[] args) {
        Print print = new Print();
        List list= Arrays.asList("first step", null, "second step");

        for (String s:list) {
            try {
                print.print(s);
            }
            catch (NullPointerException e) {
                System.out.println(e.getMessage());
                System.out.println("Exception was processed. Program continues");
            }
            finally {
                System.out.println("Inside bloсk finally");
            }
            System.out.println("Go program....");
            System.out.println("-----------------");
        }

    }
    }
اہم طریقہ کار کے نتائج :
Inside method print: first step
Inside bloсk finally
Go program....
-----------------
Exception: s is null!
Exception was processed. Program continues
Inside bloсk finally
Go program....
-----------------
Inside method print: second step
Inside bloсk finally
Go program....
-----------------
بلاک finallyکا استعمال عام طور پر ٹرائی بلاک میں کھولی جانے والی اسٹریمز کو بند کرنے یا مفت وسائل کے لیے کیا جاتا ہے۔ تاہم، پروگرام لکھتے وقت، تمام وسائل کی بندش پر نظر رکھنا ہمیشہ ممکن نہیں ہوتا۔ ہماری زندگیوں کو آسان بنانے کے لیے، جاوا کے ڈویلپرز نے ہمیں ایک ایسی تعمیر کی پیشکش کی ہے try-with-resourcesجو خود بخود ٹرائی بلاک میں کھولے گئے وسائل کو بند کر دیتی ہے۔ ہماری پہلی مثال کو اس طرح دوبارہ لکھا جا سکتا ہے try-with-resources:
public String input() throws MyException {
    String s = null;
    try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
        s = reader.readLine();
   } catch (IOException e) {
       System.out.println(e.getMessage());
   }
    if (s.equals("")){
        throw new MyException ("String can not be empty!");
    }
    return s;
}
جاوا کی صلاحیتوں کی بدولت، ورژن 7 سے شروع ہو کر، ہم ایک ہی بلاک میں مختلف قسم کے مستثنیات کی پکڑنے کو بھی یکجا کر سکتے ہیں، جس سے کوڈ کو مزید کمپیکٹ اور پڑھنے کے قابل بنایا جا سکتا ہے۔ مثال کے طور پر:
public String input() {
    String s = null;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
        s = reader.readLine();
        if (s.equals("")) {
            throw new MyException("String can not be empty!");
        }
    } catch (IOException | MyException e) {
        System.out.println(e.getMessage());
    }
    return s;
}

نتائج

جاوا میں مستثنیات کا استعمال ہمیں "بیک اپ" راستوں کے استعمال کے ذریعے پروگرام کی غلطی کو برداشت کرنے کی اجازت دیتا ہے، کیچ بلاکس کے استعمال کے ذریعے مین کوڈ کی منطق کو استثنیٰ ہینڈلنگ کوڈ سے الگ کرتا ہے، اور ہمیں ڈیلیگیٹ کرنے کا موقع بھی فراہم کرتا ہے۔ تھرو کا استعمال کرتے ہوئے ہمارے کوڈ کے صارف کو مستثنیٰ ہینڈلنگ۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION