JavaRush /مدونة جافا /Random-AR /الاستثناءات وكيفية التعامل معها
articles
مستوى

الاستثناءات وكيفية التعامل معها

نشرت في المجموعة
الاستثناءات أو الحالات الاستثنائية (الحالات) هي الأخطاء التي تحدث في البرنامج أثناء تشغيله. جميع الاستثناءات في Java هي كائنات. لذلك، لا يمكن إنشاؤها تلقائيًا عند حدوث موقف استثنائي فحسب، بل يمكن إنشاؤها أيضًا بواسطة المطور نفسه. التسلسل الهرمي لفئات الاستثناء: الاستثناءات ومعالجتها - 1تنقسم الاستثناءات إلى عدة فئات، ولكن جميعها لها سلف مشترك - الطبقة Throwable. أحفادها هي الفئات الفرعية Exceptionو Error. الاستثناءات ( Exceptions) هي نتيجة مشاكل في البرنامج تكون، من حيث المبدأ، قابلة للحل ويمكن التنبؤ بها. على سبيل المثال، حدثت القسمة على الصفر في الأعداد الصحيحة. الأخطاء ( Errors) هي مشكلات أكثر خطورة تنص مواصفات Java على أنه لا ينبغي عليك محاولة التعامل معها في برنامجك الخاص لأنها مشكلات على مستوى JVM. على سبيل المثال، تحدث استثناءات من هذا النوع في حالة نفاد الذاكرة المتوفرة للجهاز الظاهري. سيظل البرنامج غير قادر على توفير ذاكرة إضافية لـ JVM. في Java، يتم تقسيم كافة الاستثناءات إلى ثلاثة أنواع: الاستثناءات المحددة ( checked) والاستثناءات غير المحددة ( unchecked) والتي تتضمن الأخطاء ( Errors) واستثناءات وقت التشغيل ( RuntimeExceptionsالفئة المنحدرة Exception). الاستثناءات الخاضعة للرقابة هي الأخطاء التي يمكن ويجب معالجتها في البرنامج؛ جميع أحفاد فئة Exception(ولكن ليس RuntimeException) تنتمي إلى هذا النوع. يمكن إجراء معالجة الاستثناءات باستخدام عوامل التشغيل try…catchأو نقلها إلى الجزء الخارجي من البرنامج. على سبيل المثال، يمكن لإحدى الطرق تمرير الاستثناءات التي تحدث فيها أعلى في التسلسل الهرمي للاستدعاءات دون معالجتها بنفسها. لا تتطلب الاستثناءات التي لم يتم التحقق منها معالجة، ولكن يمكنك التعامل مع استثناءات الفئة إذا كنت ترغب في ذلك RuntimeException. لنقم بتجميع وتشغيل البرنامج التالي:
class Main {
     public static void main(String[] args) {
         int a = 4;
         System.out.println(a/0);
     }
}
عند التشغيل، سيتم عرض الرسالة التالية على وحدة التحكم:
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)
تعرض الرسالة فئة الاستثناء الذي حدث - ArithmeticException. يمكن معالجة هذا الاستثناء:
class Main {
     public static void main(String[] args) {
         int a = 4;
         try {
              System.out.println(a/0);
         } catch (ArithmeticException e) {
              System.out.println("Произошла недопустимая арифметическая операция");
         }
     }
}
الآن، بدلاً من رسالة الخطأ القياسية، سيتم تنفيذ كتلة catch، المعلمة الخاصة بها هي الكائن e للفئة المقابلة للاستثناء (يمكن إعطاء الكائن نفسه أي اسم، وستكون هناك حاجة إليه إذا أردنا رميه بالقوة هذا الاستثناء مرة أخرى، على سبيل المثال، بحيث يتم فحصه بواسطة معالج آخر). في هذه الحالة، تحتوي الكتلة tryعلى جزء من البرنامج حيث من المحتمل أن يحدث استثناء. يمكن للمرء tryأن يتوافق مع العديد من كتل الالتقاط مع فئات استثناء مختلفة.
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
     int[] m = {-1,0,1};
        Scanner sc = new Scanner(System.in);
        try {
            int a = sc.nextInt();
            m[a] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        }
    }
}
إذا قام المستخدم، بعد تشغيل البرنامج المقدم، بالدخول من لوحة المفاتيح 1 أو 2، فسيتم تشغيل البرنامج دون إنشاء أي استثناءات. إذا أدخل المستخدم 0، فسيحدث استثناء للفئة ArithmeticExceptionوسيتم التعامل معه بواسطة الكتلة الأولى catch. إذا أدخل المستخدم 3، فسيحدث استثناء للفئة ArrayIndexOutOfBoundsException(مصفوفة خارج الحدود)، وستتم معالجتها بواسطة الكتلة الثانية catch. إذا قام المستخدم بإدخال رقم غير صحيح، على سبيل المثال، 3.14، فسيحدث استثناء للفئة InputMismatchException(نوع الإدخال غير متطابق)، وسيتم طرحه بتنسيق خطأ قياسي، لأننا لم نتعامل معه بأي شكل من الأشكال. ومع ذلك، يمكنك إضافة معالج للفئة Exception، نظرًا لأن هذه الفئة هي الفئة الأصلية لجميع الاستثناءات الأخرى المحددة، فسوف تلتقط أيًا منها (بما في ذلك InputMismatchException).
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        int[] m = {-1,0,1};
        int a = 1;
        Scanner sc = new Scanner(System.in);
        try {
            a = sc.nextInt();
            m[a-1] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        } catch (Exception e) {
            System.out.println("Произошло ещё Howое-то исключение");
        }
    }
}
نظرًا لأن الاستثناءات مبنية على تسلسل هرمي للفئات والفئات الفرعية، فيجب عليك أولاً محاولة التعامل مع الاستثناءات الأكثر تحديدًا وبعد ذلك فقط التعامل مع الاستثناءات الأكثر عمومية. أي أننا إذا وضعنا الكتلة مع معالجة استثناء الفئة أولاً (وليس الثالث) Exception، فلن نرى أبدًا أي رسائل خطأ بخلاف "حدث بعض الاستثناءات الأخرى" (سيتم اكتشاف جميع الاستثناءات على الفور بواسطة هذه الكتلة ولن تصل إلى آحرون). يمكن أن تكون الإضافة الاختيارية للكتل عبارة try…catchعن كتلة finally. سيتم تنفيذ الأوامر الموضوعة فيه في أي حال، بغض النظر عما إذا حدث استثناء أم لا. على الرغم من أنه عند حدوث استثناء غير معالج، لا يتم تنفيذ الجزء المتبقي من البرنامج بعد إنشاء هذا الاستثناء. على سبيل المثال، في حالة حدوث استثناء أثناء بعض العمليات الحسابية الطويلة، finallyيمكنك إظهار النتائج المتوسطة أو حفظها في كتلة. رابط إلى المصدر: الاستثناءات ومعالجتها
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION