"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يختفي الاستثناء `MyExc2` في مثال معالجة استثناء Java هذا؟

لماذا يختفي الاستثناء `MyExc2` في مثال معالجة استثناء Java هذا؟

تم النشر بتاريخ 2024-11-04
تصفح:110

Why Does the `MyExc2` Exception Disappear in This Java Exception Handling Example?

معالجة الاستثناءات في عبارات الصيد والأخيرة

عند التعامل مع معالجة الاستثناءات في Java، من الضروري فهم التفاعل بين عبارات الصيد والأخيرة . خذ بعين الاعتبار المثال التالي المقدم لمهمة جامعية:

class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print(1);
            q();
        }
        catch (Exception i) {
            throw new MyExc2();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception();
        }
    }
}
السؤال المطروح لمخرجات هذا الكود. في حين أن البعض قد أجاب على "13Exception في مؤشر الترابط الرئيسي MyExc2،" الإجابة الصحيحة هي "132Exception في مؤشر الترابط الرئيسي MyExc1."

لماذا يختفي MyExc2

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

  • استثناء في كتلة الالتقاط: إذا تم طرح استثناء جديد في كتلة التقاط (كما هو موضح في رمي MyExc2() الجديد أعلاه)، فإن الاستثناء الأصلي هو "تم الإجهاض." يُترك مسار التنفيذ الحالي غير مكتمل، ويتولى الاستثناء الجديد دور الاستثناء الذي ينتشر للخارج.
  • الاستثناء في الكتلة النهائية: وبالمثل، إذا تم طرح استثناء جديد في كتلة أخيرًا، يتم أيضًا إحباط الاستثناء الأصلي. ومع ذلك، هناك نقطة مهمة يجب ملاحظتها:

    • كتلة الالتقاط أخيرًا: إذا تم طرح الاستثناء الجديد في كتلة الالتقاط أخيرًا، فسيظل خاضعًا لعنصر الالتقاط هذا أخيرًا الحظر، إن وجد.
تتبع الاستثناءات

من خلال تتبع التنفيذ بناءً على هذه المبادئ، يمكننا أن نرى ما يلي:

تطبع كتلة المحاولة في الصفحة الرئيسية "1" وتستدعي q().
  1. داخل q()، تطرح كتلة المحاولة MyExc1.
  2. كتلة الالتقاط في q() يعالج الاستثناء بصمت.
  3. الكتلة النهائية في q() تطبع "3" وتطرح استثناء.
  4. كتلة الالتقاط بشكل رئيسي:

    تم طرح MyExc2 في هذه الكتلة، مما أدى إلى إحباط MyExc1 الأصلي.
    • ومع ذلك، تحتوي كتلة الالتقاط على كتلة أخيرًا لا تزال قيد التنفيذ.
  5. أخيرًا الحظر الرئيسي:

    يتم طرح MyExc1 في هذه الكتلة، مما يؤدي إلى إحباط MyExc2.
  6. لذلك، فإن الإخراج الصحيح هو "132Exception في مؤشر الترابط الرئيسي MyExc1." تم "نسيان" استثناء MyExc2 لأنه تم طرح استثناء جديد (MyExc1) في الكتلة الأخيرة من كتلة الالتقاط التي كانت تتعامل مع MyExc2.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3