استثناءات Java غير معلوم <BR /> قبل أن تتعلم التعامل مع الاستثناءات في البرنامج ، من المفيد معرفة ما يحدث إذا لم تتعامل معها. يتضمن التطبيق التالي تعبيرًا يتسبب عمداً في حدوث خطأ فائق.
class exc0 {public static void main (string []) {int d = 0 ؛
عندما يتحقق نظام وقت تشغيل Java للموقف المقسم على الصفر ، فإنه يبني كائن استثناء جديد ويرمي الاستثناء. يؤدي هذا إلى إيقاف تنفيذ Exc0 ، لأنه بمجرد إلقاء استثناء ، يجب أن يتم اكتشافه بواسطة معالج استثناء ومعالجته على الفور. في هذا المثال ، لا نقدم أيًا من معالجات الاستثناءات الخاصة بنا ، لذلك يتم اكتشاف الاستثناء من قبل المعالج الافتراضي لنظام وقت تشغيل Java. سيتم التعامل مع أي استثناء لم يتم اكتشافه بواسطة برنامجك من قبل المعالج الافتراضي. يعرض المعالج الافتراضي سلسلة تصف الاستثناء ، ويطبع تتبع المكدس حيث يحدث الاستثناء ، وينهي البرنامج.
فيما يلي الإخراج الذي تم إنشاؤه بواسطة مترجم تشغيل Javajdk القياسي لتنفيذ البرنامج:
java.lang.arithmeticexception: / by Zero at Exc0.main (exc0.java:4)
لاحظ كيف يتم تضمين اسم الفئة Exc0 ، اسم الطريقة الرئيسية ، اسم الملف exc0.java ورقم السطر 4 في مسار استخدام مكدس بسيط. لاحظ أيضًا أن نوع الاستثناء الذي تم طرحه هو فئة فرعية من الاستثناءات تسمى ArithMeticeSception ، والتي تصف بشكل أكثر وضوحًا نوع طريقة الخطأ. ناقش لاحقًا في هذا الفصل ، توفر Java أنواع استثناءات مضمنة متعددة تتطابق مع أنواع مختلفة من أخطاء وقت التشغيل التي قد يتم إنشاؤها.
سيعرض مسار المكدس تسلسل مكالمات الطريقة التي أدت إلى الخطأ. على سبيل المثال ، إليك إصدار آخر من البرنامج السابق يقدم نفس الخطأ ، ولكن يتم إنشاء الخطأ بطريقة أخرى غير الطريقة الرئيسية ():
class exc1 {static void subroutine () {int d = 0 ؛
تُظهر نتائج مسار المكدس لمعالج الاستثناء الافتراضي كيف يتم عرض مكدس الاتصال بالكامل:
java.lang.arithmeticexception: / by Zero at Exc1.Subroutine (exc1.java:4) at Exc1.main (exc1.java:7)
كما ترون ، فإن الجزء السفلي من المكدس هو السطر 7 من Main ، والذي يطلق على طريقة الروتين الفرعي (). هذه الطريقة تسبب استثناء في السطر 4. يعد مكدس المكالمات مهمًا لتصحيح الأخطاء لأنه يحدد الخطوات الدقيقة التي تؤدي إلى الخطأ.
تعشيش جافا جرب البيانات
جرب البيانات يمكن أن تكون متداخلة. وهذا هو ، يمكن أن تكون عبارة المحاولة داخل كتلة تجربة أخرى. في كل مرة تدخل فيها بيان المحاولة ، سيتم دفع الاستثناء قبل وبعد العلاقات إلى المكدس. إذا لم تحتوي عبارة TRY الداخلية على معالج الصيد مع استثناءات خاصة ، فسيظهر المكدس وسيقوم معالج الصيد في عبارة المحاولة التالية بالتحقق مما إذا كان يتطابق معه. ستستمر هذه العملية حتى تتطابق بيان الصيد بنجاح ، أو حتى يتم استنفاد جميع عبارات المحاولة المتداخلة. في حالة عدم تطابق بيان الصيد ، سيتعامل نظام وقت تشغيل Java مع هذا الاستثناء. فيما يلي مثال على استخدام عبارات المحاولة المتداخلة:
// مثال على بيانات المحاولة المتداخلة. تقسيم-Zero استثناء. سيتم إنشاء استثناء من by-Zero بواسطة الكود التالي. ou-من الاستثناء e) {system.out.println ("فهرس Array خارج الحدود:" + e) ؛
كما ترون ، يقوم البرنامج بوشك كتلة أخرى في كتلة محاولة. يعمل البرنامج على النحو التالي: عند تنفيذ البرنامج بدون معلمات سطر الأوامر ، ستقوم كتلة المحاولة الخارجية بإنشاء استثناء مقسومًا على الصفر. يتم تنفيذ البرنامج تحت شرط معلمة سطر الأوامر ، ويؤدي الخطأ المقسم على كتلة المحاولة المتداخلة إلى خطأ قابل للقسمة. نظرًا لأن الكتلة الداخلية لا تتطابق مع هذا الاستثناء ، فسيتمرير الاستثناء إلى كتلة المحاولة الخارجية حيث تتم معالجة الاستثناء. إذا قمت بتنفيذ البرنامج مع معلمات سطر الأوامر ، يتم إنشاء استثناء حدود الصفيف بواسطة كتلة المحاولة الداخلية. توضح النتائج التالية كل حالة:
C:/> java nesttrydivide by 0: java.lang.arithMeticexception:/by zeroc:/> java nesttry onea = 1divide by 0: java.lang.arithmeticexception:/by zeroc:/> java nesttry one اثنين = 2array index- من الحدود: java.lang.arrayindexoutofboundsexception
عندما تكون هناك استدعاء طريقة ، يمكن أن يحدث تعشش عبارات المحاولة سراً للغاية. على سبيل المثال ، يمكنك إجراء مكالمة على طريقة في كتلة المحاولة. داخل هذه الطريقة ، هناك بيان تجربة آخر. في هذه الحالة ، لا تزال المحاولة داخل الطريقة متداخلة في كتلة المحاولة التي تستدعي الطريقة خارجيًا. فيما يلي تعديل للمثال السابق ، ويتم نقل كتل المحاولة المتداخلة إلى الداخل من طريقة NESTRY ():
/* يمكن أن تكون عبارات المحاولة متداخلة ضمنيًا عبر المكالمات إلى الأساليب. -سيتم إنشاء استثناء الصفر بواسطة الكود التالي. F- استثناء .out .println ("فهرس المصفوفة خارج الحدود:" + E) ؛ تم إرساله مسبقًا ، سيؤدي إلى استثناء الفجوة. ) {system.
إخراج هذا البرنامج هو نفسه كما في المثال السابق.