CodeGym /جاوا بلاگ /Random-UR /جاوا تھرو استثناء
John Squirrels
سطح
San Francisco

جاوا تھرو استثناء

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

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

ایک استثناء ایک ایسا واقعہ ہے جو پروگرام کے عمل کے دوران ہوتا ہے جو پروگرام کی ہدایات کے عام بہاؤ میں خلل ڈالتا ہے۔ جب کوئی استثناء ہوتا ہے تو، پروگرام پر عمل درآمد روک دیا جاتا ہے، اور غلطی کا پیغام کنسول پر ظاہر ہوتا ہے۔ جاوا میں، دو قسم کی مستثنیات ہیں: چیک شدہ اور غیر چیک شدہ۔ چیک شدہ مستثنیات کو کمپائل کے وقت چیک کیا جاتا ہے، اور کمپائلر اس بات کو یقینی بناتا ہے کہ وہ کالنگ کے طریقہ کار کے ذریعے پکڑے گئے ہیں یا ان کا اعلان کیا گیا ہے۔ دوسری طرف، غیر چیک شدہ مستثنیات کو مرتب کرنے کے وقت چیک نہیں کیا جاتا ہے، اور وہ پکڑے جا سکتے ہیں یا بغیر پکڑے چھوڑے جا سکتے ہیں۔ یہاں کوڈ کی ایک مثال ہے جس میں غلطی ہوسکتی ہے، لیکن مرتب کرنے والا اسے چھوڑ دیتا ہے۔

public class Factorial {
   public static long getFactorial(final int number) {
           long fact = 1;
           for (int i = 1; i <= number; i++) {
               fact = fact * i;
           }
           return fact;
   }

   public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }

}
پروگرام کا آؤٹ پٹ یہ ہے:
1 -4249290049419214848
پروگرام صحیح طریقے سے باہر نکلا، لیکن اس کا نتیجہ غلط نکلا۔ پہلی صورت میں، کیونکہ فنکشن کی دلیل منفی تھی، اور فیکٹریل منفی نمبروں کے لیے کام نہیں کرتا ہے۔ دوسری صورت میں، نتیجہ غلط تھا، کیونکہ تعداد اتنی بڑی ہے کہ لمبی قسم کی حد میں اس کے فیکٹریل کو شمار نہیں کیا جا سکتا۔ یہاں ایک اور مثال ہے۔ آئیے ایک پروگرام لکھتے ہیں جس میں ہم ایک نمبر کو دوسرے نمبر سے تقسیم کریں گے۔

public class DivisionExample {

       public static void main(String[] args) {
           int a = 10;
           int b = 0;
           int result = divide(a, b);
           System.out.println(result);
       }

       public static int divide(int a, int b) {
           return a / b;
       }
}
اس مثال میں، ایک ArithmeticException پھینکا جا رہا ہے کیونکہ متغیر b صفر ہے۔ تاہم، اس غلطی کو سنبھالا نہیں جاتا ہے، لہذا پروگرام ایک غلط حیثیت کے ساتھ باہر نکل جاتا ہے.

جاوا میں استثناء کیسے پھینکا جائے۔

جاوا میں، مستثنیات بھی آبجیکٹ ہیں، لہذا ایک استثناء کو بالکل اسی طرح پھینک دیا جاتا ہے جیسے کسی نئے Exception آبجیکٹ کو بنایا گیا ہے۔ تھرو بیان کا استعمال کرتے ہوئے پروگرام میں ایک استثناء پھینکا جاتا ہے۔ عام طور پر، یہ دو کارروائیاں (آبجیکٹ تخلیق اور استثناء پھینکنا) کو ایک میں ملایا جاتا ہے:

 throw new Exception("error…");
جاوا میں تھرو کی ورڈ کا استعمال کسی طریقہ یا کوڈ کے بلاک سے استثنیٰ دینے کے لیے کیا جاتا ہے جب کوئی خرابی یا غیر معمولی حالت پیش آتی ہے جسے پروگرام رن ٹائم پر ہینڈل نہیں کر سکتا۔ پروگرام کے بہاؤ کو قریب ترین کیچ بلاک پر بھیج دیا جاتا ہے۔ یہ بلاک استثنا کا انتظام کر سکتا ہے۔

'تھرو' مطلوبہ الفاظ کے استعمال کی مثال

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

public Class Factorial {

public static long getFactorial(final int number) {
   if ((number >= 0) && (number < 21)) {
       long fact = 1;
       for (int i = 1; i <= number; i++) {
           fact = fact * i;
       }
       return fact;
   } else {

//throw new exception here 
       throw new IllegalArgumentException("THe argument isn't legal");
   }
}

 public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }
}
اس مثال میں، اگر نمبر کی قدر منفی ہے، تو تھرو کی ورڈ کو IllegalArgumentException کلاس کی مثال دینے کے لیے استعمال کیا جاتا ہے ۔ اگر آپ پروگرام چلاتے ہیں تو کنسول پر "دلیل قانونی نہیں ہے" کا پیغام ظاہر ہوگا۔ پروگرام پر عمل درآمد روک دیا جائے گا۔

مزید غلطیاں نہیں: ایک استثنائی مثال کو پکڑنا

اب آئیے دوسری مثال کو یاد کرتے ہیں، صفر سے تقسیم کے ساتھ، اور اسے مستثنیٰ ہینڈلنگ کے ساتھ انجام دیں۔

public class DivisionExample {

    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try {
            int result = divide(a, b);
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: division by zero");
        }
    }

    public static int divide(int a, int b) {
        return a / b;
    }
}
اس مثال میں، ہم نے تقسیم بہ صفر استثنیٰ کو ہینڈل کرنے کے لیے ٹرائی کیچ کنسٹرکٹ شامل کیا ہے۔ مختصراً، try-catch-finally ایک جاوا پروگرامنگ لینگویج کی تعمیر ہے جو آپ کو مستثنیات کو سنبھالنے اور کوڈ پر عمل کرنے کی اجازت دیتی ہے قطع نظر اس کے کہ کوئی استثناء واقع ہوا ہے یا نہیں۔ ٹرائی کیچ آخر میں تین بلاکس پر مشتمل ہے:
  • کوشش بلاک . ممکنہ طور پر خطرناک کوڈ کو یہاں پر عمل میں لایا جا رہا ہے۔ یہ وہ کوڈ ہے جو ایک استثناء پھینک سکتا ہے۔ اگر ٹرائی بلاک کے اندر کوئی استثناء ہوتا ہے ، تو اس بلاک میں کوڈ پر عمل درآمد روک دیا جاتا ہے، اور کنٹرول کو کیچ بلاک میں منتقل کر دیا جاتا ہے۔
  • کیچ بلاک ۔ یہاں پھینکی گئی رعایت کو سنبھالا جاتا ہے۔ کیچ بلاک میں ، آپ یہ بتا سکتے ہیں کہ کس استثناء کو پکڑنا ہے اور پکڑے جانے پر کس منطق پر عمل کرنا ہے۔
  • آخر میں بلاک۔ اس کو پھانسی دی جاتی ہے قطع نظر اس سے کہ کوئی استثنا ہوا ہے یا نہیں۔ آخر میں بلاک کا استعمال کیا جاتا ہے، مثال کے طور پر، وسائل کو جاری کرنے کے لیے (جیسے فائل یا ساکٹ کو بند کرنا) جو ایک ٹرائی بلاک میں مختص کیے گئے تھے۔ آپ اس بلاک کو چھوڑ سکتے ہیں۔
ٹرائی کیچ فائنل کنسٹرکٹ غیر معمولی حالات کی صورت میں پروگرام پر عمل درآمد پر زیادہ درست کنٹرول کی اجازت دیتا ہے اور غلطیوں کی صورت میں پروگرام کو غیر متوقع طور پر ختم ہونے سے روکنے میں مدد کرتا ہے۔ اب، آئیے اپنی مثال پر واپس جائیں۔ اگر تقسیم کے طریقہ کار کے دوران صفر کے حساب سے تقسیم ہوتی ہے تو، ایک ریاضی کا استثناء پھینکا جائے گا، جو کیچ بلاک کے ذریعے پکڑا جاتا ہے۔ کیچ بلاک میں ، ہم کنسول پر صرف ایک ایرر میسج پرنٹ کرتے ہیں۔ اگر کوئی رعایت نہیں ہوتی ہے، تو پروگرام اپنا عمل جاری رکھے گا۔

مطلوبہ الفاظ پھینک دیتا ہے

تھرو کلیدی لفظ میتھڈ دستخط میں استعمال ہوتا ہے۔ اگر ایسا ہے تو، اس کا مطلب ہے کہ طریقہ کار میں ایک استثناء ڈالا جا رہا ہے۔ یہ کال اسٹیک میں مستثنیات کو بڑھا سکتا ہے اور اس بات کی نشاندہی کرتا ہے کہ مستثنیات کو موجودہ طریقہ کار میں سنبھالنے کی ضرورت نہیں ہے۔ جاوا میں، "تھرو" کا استعمال کسی پروگرام میں بیان کردہ اپنی مرضی کے استثناء کا حوالہ دینے کے لیے بھی کیا جا سکتا ہے۔ مثال کے طور پر، ایک طریقہ دو نمبروں کی تقسیم کو انجام دے سکتا ہے لیکن اگر دوسری دلیل صفر ہے تو IllegalArgumentException پھینک دے:

public static double divide(double a, double b) throws IllegalArgumentException {
    if (b == 0) {
        throw new IllegalArgumentException("Division by zero is not allowed");
    }
    return a / b;
}
یہ طریقہ یہ بتانے کے لیے تھرو کلیدی لفظ کا استعمال کرتا ہے کہ اگر دوسری دلیل null ہو تو ایک IllegalArgumentException پھینکا جا سکتا ہے۔ اگر طریقہ کار پر عمل کرتے وقت اس طرح کی کوئی استثناء واقع ہوتی ہے، تو اسے پروسیسنگ کے لیے کالنگ کے طریقہ کار میں منتقل کر دیا جائے گا۔ طریقہ کال مثال:

public static void main(String[] args) {
    double result = 0;
    try {
        result = divide(10, 0);
    } catch (IllegalArgumentException e) {
        System.out.println("Error: " + e.getMessage());
    }
    System.out.println("Result: " + result);
}
اس مثال میں، divide() طریقہ کو دلائل 10 اور 0 کے ساتھ کہا جاتا ہے، جو صفر سے تقسیم کے ناممکن ہونے کی وجہ سے ایک IllegalArgumentException پھینک دے گا۔ رعایت کو ٹرائی کیچ بلاک کے ذریعے پکڑا جائے گا، اور ایک ایرر میسج ظاہر ہوگا۔ پروگرام کے نتیجے میں صفر کی قدر ہوگی کیونکہ استثنا divide() طریقہ کار کو ختم کرتا ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION