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

لماذا ينتج كود معالجة استثناءات Java \"132Exception في مؤشر الترابط الرئيسي MyExc1\" بدلاً من \"13Exception في مؤشر الترابط الرئيسي MyExc2\"؟

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

Why does the Java exception handling code produce \

معالجة الاستثناءات في Java: كشف الغموض

في سيناريو محير لمعالجة استثناءات Java، قدم سؤال جامعي مقتطف التعليمات البرمجية التالي:

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

// Main Class
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".

توضيح الغموض

لفك هذا اللغز، من الضروري فهم أسبقية الاستثناءات:

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

    • تم إيقاف نشر الاستثناء الحالي.
    • يصبح الاستثناء الجديد هو الاستثناء المنتشر.
    • يعمل الاستثناء الجديد على فك المكدس كالمعتاد، مواجهة أي صيد قابل للتطبيق أو حظر نهائي.

استعادة التنفيذ

تطبيق هذا المبدأ على الكود:

  1. التنفيذ الأولي

    : السطر 13: يتم طرح MyExc1 في كتلة محاولة q ().

      السطر 18: تم اكتشاف MyExc1 في كتلة الالتقاط الخاصة بـ q().
    • السطر 21: تم تنفيذ السطر 21 (المطبوعات 3).
  2. Catch Block استثناء:
  3. السطر 19: تم طرح MyExc2 في كتلة الالتقاط الرئيسية ().

      السطر 22: MyExc2 يجهض نشر MyExc1.
    • ]السطر 19: يبدأ MyExc2 في تفكيك المكدس.
    استئناف التنفيذ في كتلة المحاولة الرئيسية:
  4. السطر 15 : تم تنفيذ السطر 15 (المطبوعات 2).

    السطر 16: تم طرح MyExc1 في الكتلة النهائية للـ main().
    • السطر 16: MyExc1 يجهض نشر MyExc2.
    • السطر 16: يبدأ MyExc1 في تفكيك المكدس (ولا يزال خاضعًا للحظر الرئيسي أخيرًا).
    استثناء الحظر النهائي:
  5. السطر 23: تم طرح الاستثناء في الكتلة النهائية للـ main ().

    السطر 23: الاستثناء يجهض نشر MyExc1.
    • السطر 23: يبدأ الاستثناء في الفك أعلى المكدس.
  6. الإخراج النهائي هو "132Exception في مؤشر الترابط الرئيسي MyExc1" لأن الاستثناء الذي ينتشر للخارج الطريقة الرئيسية هي MyExc1 التي تم طرحها في السطر 16. يتم إحباط MyExc2 التي تم طرحها في السطر 19 عندما يتم طرح MyExc1 في السطر 16.
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3