CodeGym /مدونة جافا /Random-AR /جافا رمي استثناء
John Squirrels
مستوى
San Francisco

جافا رمي استثناء

نشرت في المجموعة
في كل مكان نذهب إليه، تنتظرنا أحداث غير متوقعة. الزلازل، أو التصرفات غير العقلانية للأشخاص، أو النيازك... أو أي شيء أبسط - يحترق مصباح كهربائي، أو تختفي مغناطيسية بطاقة مصرفية، أو ينكسر مقياس البنزين. لا يمكننا تعطيل الأحداث غير المتوقعة، ولكن يمكننا على الأقل الاستعداد لها جزئيًا. أي أنه يجب علينا إعداد آليات معينة للتعامل معها. في عالم البرمجة، وتحديداً في لغة جافا، تسمى الأحداث التي تمنع البرنامج من العمل بشكل طبيعي بالاستثناءات، وآليات منع تعطل البرنامج تسمى معالجة الاستثناءات. لذا، عندما يحدث حدث غير متوقع في برنامج ما، مثل القسمة على صفر، فيجب أن "يطرح" استثناءً. تعد معالجة الاستثناءات أحد الجوانب المهمة في برمجة Java والتي تساعد المطورين على إدارة الأخطاء والاستثناءات التي قد تحدث أثناء تنفيذ البرنامج. في هذه المقالة، سنركز على أحد المفاهيم الأساسية لمعالجة الاستثناءات: الكلمة الأساسية لرمي Java وكيفية استخدامها لطرح استثناء.

ما هو الاستثناء في جافا؟

الاستثناء هو الحدث الذي يحدث أثناء تنفيذ البرنامج والذي يعطل التدفق الطبيعي لتعليمات البرنامج. عند حدوث استثناء، يتم إيقاف تنفيذ البرنامج، ويتم عرض رسالة الخطأ على وحدة التحكم. في Java، هناك نوعان من الاستثناءات: محددة وغير محددة. يتم التحقق من الاستثناءات المحددة في وقت الترجمة، ويتأكد المترجم من اكتشافها أو الإعلان عنها بواسطة طريقة الاستدعاء. من ناحية أخرى، لا يتم التحقق من الاستثناءات التي لم يتم التحقق منها في وقت الترجمة، ويمكن اكتشافها أو تركها دون اكتشافها. فيما يلي مثال للتعليمات البرمجية التي قد يحدث فيها خطأ، ولكن المترجم يتخطاه.
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 يساوي صفرًا. ومع ذلك، لم تتم معالجة هذا الخطأ، لذا يخرج البرنامج بحالة غير صحيحة.

كيفية طرح استثناء في جافا

في Java، الاستثناءات هي أيضًا كائنات، لذلك يتم طرح الاستثناء تمامًا مثل كائن الاستثناء الجديد الذي تم إنشاؤه. يتم طرح استثناء في برنامج باستخدام عبارة الرمي. عادة، يتم دمج هاتين العمليتين (إنشاء الكائن وطرح الاستثناء) في عملية واحدة:
throw new Exception("error…");
يتم استخدام الكلمة الأساسية throw في Java لطرح استثناء من طريقة أو مجموعة من التعليمات البرمجية عند حدوث خطأ أو حالة استثنائية لا يستطيع البرنامج التعامل معها في وقت التشغيل. تتم إعادة توجيه تدفق البرنامج إلى أقرب كتلة التقاط. يمكن لهذه الكتلة إدارة الاستثناء.

مثال على استخدام الكلمة الرئيسية "رمي".

لتوضيح وظيفة الكلمة الأساسية throw في Java، لنأخذ مثالاً. دعونا نكتب طريقة لحساب مضروب الرقم. إذا كان الرقم سالبًا، فلا يمكن حسابه، لذا يجب طرح استثناء. وبالمثل، إذا كان الرقم كبيرًا جدًا، فستتجاوز نتيجة العامل الحد الأقصى لحجم النوع الطويل، وسيتم طرح استثناء آخر. هنا لدينا تنفيذ الطريقة:
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));

   }
}
في هذا المثال، إذا كانت قيمة الرقم سالبة، فسيتم استخدام الكلمة الأساسية throw لرمي مثيل للفئة 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 هو بناء لغة برمجة Java يسمح لك بمعالجة الاستثناءات وتنفيذ التعليمات البرمجية بغض النظر عما إذا كان قد حدث استثناء أم لا. تتكون محاولة الالتقاط أخيرًا من ثلاث كتل:
  • كتلة المحاولة . يتم تنفيذ تعليمات برمجية خطرة محتملة هنا. هذا هو الكود الذي يمكنه طرح استثناء. إذا حدث استثناء داخل كتلة المحاولة ، فسيتم إحباط تنفيذ التعليمات البرمجية في تلك الكتلة، ويتم نقل التحكم إلى كتلة الالتقاط.
  • كتلة الصيد . هنا تتم معالجة الاستثناء المطروح. في كتلة الالتقاط ، يمكنك تحديد الاستثناء الذي سيتم التقاطه والمنطق الذي سيتم تنفيذه عند اكتشافه.
  • الكتلة أخيرا . يتم تنفيذ هذا بغض النظر عما إذا حدث استثناء أم لا. يتم استخدام الكتلة الأخيرة ، على سبيل المثال، لتحرير الموارد (مثل إغلاق ملف أو مأخذ توصيل) التي تم تخصيصها في كتلة المحاولة. يمكنك حذف هذه الكتلة.
تسمح بنية Try -catch-finally بتحكم أكثر دقة في تنفيذ البرنامج في حالة المواقف الاستثنائية وتساعد على منع الإنهاء غير المتوقع للبرنامج في حالة حدوث أخطاء. الآن، دعونا نعود إلى مثالنا. إذا حدثت القسمة على صفر أثناء طريقة القسمة، فسيتم طرح استثناء حسابي ، والذي يتم التقاطه بواسطة كتلة الالتقاط. في كتلة الصيد ، نقوم ببساطة بطباعة رسالة خطأ إلى وحدة التحكم. في حالة عدم حدوث أي استثناء، سيستمر البرنامج في تنفيذه.

يلقي الكلمة الرئيسية

يتم استخدام الكلمة الأساسية throws في توقيع الطريقة. إذا كان الأمر كذلك، فهذا يعني أنه تم طرح استثناء في الأسلوب. يمكن أن يؤدي هذا إلى نشر الاستثناءات في مكدس الاستدعاءات والإشارة إلى أن الاستثناءات لا تحتاج إلى معالجتها بالطريقة الحالية. في Java، يمكن أيضًا استخدام "الرميات" للإشارة إلى الاستثناءات المخصصة المحددة في البرنامج. على سبيل المثال، قد تقوم إحدى الطرق بتقسيم رقمين ولكنها تطرح استثناء 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;
}
تستخدم هذه الطريقة الكلمة الأساسية throws للإشارة إلى أنه يمكن طرح 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 نظرًا لاستحالة القسمة على صفر. سيتم اكتشاف الاستثناء بواسطة كتلة محاولة الالتقاط ، وسيتم عرض رسالة خطأ. سينتج عن البرنامج قيمة صفر لأن الاستثناء ينهي تنفيذ طريقة القسمة () .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION