CodeGym /جاوا بلاگ /Random-UR /جاوا میں مستثنیات
John Squirrels
سطح
San Francisco

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

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

جاوا کی رعایت کیا ہے؟

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

مطلوبہ الفاظ کے بارے میں چند الفاظ

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

public String input() throws MyException { // Use throws to warn
// that the method may throw a MyException
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String s = null;
// We use a try block to wrap code that might create an exception. In this case,
// the compiler tells us that the readLine() method in the
// BufferedReader class might throw an I/O exception
    try {
        s = reader.readLine();
// We use a catch block to wrap the code that handles an IOException
    } catch (IOException e) {
        System.out.println(e.getMessage());
// We close the read stream in the finally block
    } finally {
// An exception might occur when we close the stream if, for example, the stream was not open, so we wrap the code in a try block
        try {
            reader.close();
// Handle exceptions when closing the read stream
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    if (s.equals("")) {
// We've decided that an empty string will prevent our program from working properly. For example, we use the result of this method to call the substring(1, 2) method. Accordingly, we have to interrupt the program by using throw to generate our own MyException exception type.
        throw new MyException("The string cannot be empty!");
    }
    return s;
}

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

آئیے حقیقی دنیا سے ایک مثال دیکھتے ہیں۔ تصور کریں کہ ہائی وے کے ایک حصے میں ایک چھوٹا پل ہے جس میں وزن کی محدود گنجائش ہے۔ اگر پل کی حد سے زیادہ بھاری گاڑی اس پر چلتی ہے تو یہ گر سکتی ہے۔ ڈرائیور کے لیے صورت حال ہو جائے گی، اسے ہلکے سے، غیر معمولی. اس سے بچنے کے لیے محکمہ ٹرانسپورٹ کچھ بھی غلط ہونے سے پہلے سڑک پر انتباہی نشانات لگا دیتا ہے۔ انتباہی نشان دیکھ کر، ڈرائیور اپنی گاڑی کے وزن کا موازنہ پل کے زیادہ سے زیادہ وزن سے کرتا ہے۔ اگر گاڑی بہت زیادہ ہے تو ڈرائیور بائی پاس کا راستہ اختیار کرتا ہے۔ محکمہ ٹرانسپورٹ نے سب سے پہلے ٹرک ڈرائیوروں کے لیے یہ ممکن بنایا کہ وہ ضرورت پڑنے پر اپنا روٹ تبدیل کر سکتے ہیں، دوسرا، ڈرائیوروں کو مین روڈ پر موجود خطرات کے بارے میں خبردار کیا اور تیسرے، ڈرائیوروں کو خبردار کیا کہ پل کو بعض شرائط کے تحت استعمال نہیں کرنا چاہیے۔ جاوا میں مستثنیات - 2کسی پروگرام میں غیر معمولی حالات کو روکنے اور حل کرنے کی صلاحیت، اسے جاری رکھنے کی اجازت دینا، جاوا میں مستثنیات کو استعمال کرنے کی ایک وجہ ہے۔ استثنیٰ کا طریقہ کار آپ کو اپنے کوڈ (API) کو کسی بھی ان پٹ کی توثیق (چیکنگ) کرکے غلط استعمال سے بچانے دیتا ہے۔ اب تصور کریں کہ آپ ایک سیکنڈ کے لیے محکمہ ٹرانسپورٹ ہیں۔ سب سے پہلے، آپ کو ان جگہوں کو جاننے کی ضرورت ہے جہاں گاڑی چلانے والے پریشانی کی توقع کر سکتے ہیں۔ دوسرا، آپ کو انتباہی نشانیاں بنانے اور انسٹال کرنے کی ضرورت ہے۔ اور آخر میں، اگر مرکزی راستے پر مسائل پیدا ہوتے ہیں تو آپ کو راستے فراہم کرنے کی ضرورت ہے۔ جاوا میں، استثنائی طریقہ کار اسی طرح کام کرتا ہے۔ ترقی کے دوران، ہم کوڈ کے خطرناک حصوں کے ارد گرد "استثنیٰ رکاوٹیں" بنانے کے لیے ایک ٹرائی بلاک کا استعمال کرتے ہیں، ہم ایک کیچ {} بلاک کا استعمال کرتے ہوئے "بیک اپ روٹس" فراہم کرتے ہیں، اور ہم کوڈ لکھتے ہیں جو آخرکار{} بلاک میں کچھ بھی نہیں چلنا چاہیے۔ . اگر ہم "بیک اپ روٹ" فراہم نہیں کر سکتے یا ہم صارف کو انتخاب کا حق دینا چاہتے ہیں، تو ہمیں کم از کم اسے خطرے سے خبردار کرنا چاہیے۔ کیوں؟ ذرا ایک ڈرائیور کے غصے کا تصور کریں جو ایک بھی انتباہی نشان دیکھے بغیر، ایک چھوٹے سے پل پر پہنچ جاتا ہے جسے وہ عبور نہیں کر سکتا! پروگرامنگ میں، جب اپنی کلاسیں اور طریقے لکھتے ہیں، تو ہم ہمیشہ یہ اندازہ نہیں لگا سکتے کہ دوسرے ڈویلپرز ان کا استعمال کیسے کر سکتے ہیں۔ نتیجے کے طور پر، ہم ایک غیر معمولی صورت حال کو حل کرنے کے 100% درست طریقے کا اندازہ نہیں لگا سکتے۔ اس نے کہا، غیر معمولی حالات کے امکان کے بارے میں دوسروں کو خبردار کرنا اچھی شکل ہے۔ جاوا کا استثنیٰ میکانزم ہمیں تھرو کلیدی لفظ کے ساتھ ایسا کرنے دیتا ہے - بنیادی طور پر یہ اعلان کہ ہمارے طریقہ کار کے عمومی رویے میں ایک استثناء پھینکنا شامل ہے۔ اس طرح، طریقہ استعمال کرنے والا کوئی بھی جانتا ہے کہ اسے مستثنیات کو سنبھالنے کے لیے کوڈ لکھنا چاہیے۔

دوسروں کو "پریشانی" کے بارے میں خبردار کرنا

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

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

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

استثنیٰ پیدا کرنا

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

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

جاوا میں، ہم کوڈ بلاکس بناتے ہیں جہاں ہم try{}catch ، try{}catch{}finally ، اور کوشش{}finally{} تعمیرات کا استعمال کرتے ہوئے مستثنیٰ ہینڈلنگ کی ضرورت کا اندازہ لگاتے ہیں ۔ جب ٹرائیجاوا میں مستثنیات - 4 بلاک میں ایک استثناء پھینک دیا جاتا ہے ، JVM اگلے کیچ بلاک میں ایک مناسب استثنا ہینڈلر کی تلاش کرتا ہے۔ اگر ایک کیچ بلاک میں مطلوبہ استثناء ہینڈلر ہے، تو کنٹرول اس کے پاس جاتا ہے۔ اگر نہیں، تو JVM کیچ بلاکس کی زنجیر کو مزید نیچے دیکھتا ہے جب تک کہ مناسب ہینڈلر نہ مل جائے۔ کیچ بلاک پر عمل کرنے کے بعد ، کنٹرول کو اختیاری آخر میں بلاک میں منتقل کر دیا جاتا ہے۔ اگر کوئی مناسب کیچ بلاک نہیں ملتا ہے، تو JVM پروگرام کو روکتا ہے اور اسٹیک ٹریس (میتھڈ کالز کا موجودہ اسٹیک) دکھاتا ہے، پہلے انجام دینے کے بعد اگر یہ موجود ہو تو آخر میں بلاک کر دیں۔ استثنیٰ ہینڈلنگ کی مثال:
public class Print {

     void print(String s) {
        if (s == null) {
            throw new NullPointerException("Exception: s is null!");
        }
        System.out.println("Inside print method: " + 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 handled. The program will continue");
            }
            finally {
                System.out.println("Inside finally block");
            }
            System.out.println("The program is running...");
            System.out.println("-----------------");
        }

    }
    }
یہاں اہم طریقہ کے نتائج ہیں :
Inside print method: first step
Inside finally block
The program is running...
-----------------
Exception: s is null!
Exception handled. The program will continue
Inside finally block
The program is running...
-----------------
Inside print method: second step
Inside finally block
The program is running...
-----------------
آخر میں عام طور پر کسی بھی سلسلے کو بند کرنے اور ٹرائی بلاک میں کھولے/مختص کیے گئے وسائل کو آزاد کرنے کے لیے استعمال کیا جاتا ہے۔ تاہم، پروگرام لکھتے وقت، تمام وسائل کی بندش پر نظر رکھنا ہمیشہ ممکن نہیں ہوتا۔ ہماری زندگیوں کو آسان بنانے کے لیے، جاوا کے ڈویلپرز وسائل کے ساتھ کوشش کرنے کی پیش کش کرتے ہیں ، جو خود بخود کسی بھی وسائل کو آزمانے کے لیے بند کر دیتا ہے ۔ ہماری پہلی مثال کو وسائل کے ساتھ کوشش کے ساتھ دوبارہ لکھا جا سکتا ہے :
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 ("The string cannot 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("The string cannot 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