حاول Java الاستخدام <BR /> على الرغم من أن معالج الاستثناء الافتراضي الذي يوفره نظام وقت تشغيل Java مفيد لتصحيح الأخطاء ، إلا أنك تريد التعامل مع الاستثناءات بنفسك. هناك فائدتان للقيام بذلك. أولاً ، يسمح لك بإصلاح الأخطاء. ثانياً ، يمنع البرنامج من الإنهاء تلقائيًا. يشعر معظم المستخدمين بالضيق (على أقل تقدير) حول مسارات الطباعة عندما ينتهي البرنامج وكلما حدث خطأ. لحسن الحظ ، من السهل تجنب هذا.
لمنع ومعالجة خطأ وقت التشغيل ، تحتاج فقط إلى وضع الرمز الذي تريد مراقبته في كتلة المحاولة. بعد كتلة المحاولة ، بما في ذلك شرط الصيد الذي يحدد نوع الخطأ الذي تريد التقاطه. من السهل جدًا إكمال هذه المهمة.
Class Exc2 {public static void (args []) {int d ، مطبوعة. ") ؛} catch (ArithMeticexception e) {// catch divide-by-zero error system.out.println (" Division by Zero. ") ؛} system.out.println (" بعد بيان c atch. ") ؛ يخرج البرنامج على النحو التالي:
تقسيم بواسطة صفر. بعد بيان الصيد.
لاحظ أنه لا يتم تنفيذ المكالمة إلى println () في كتلة المحاولة. بمجرد رفع الاستثناء ، يتم نقل التحكم في البرنامج من كتلة المحاولة إلى كتلة الصيد. لا "يعود" التنفيذ من كتلة الصيد إلى كتلة المحاولة. لذلك ، "لن يتم طباعة هذا".
لن يتم عرضه. بمجرد تنفيذ بيان الصيد ، يستمر التحكم في البرنامج من السطر التالي من آلية المحاولة/الصيد بأكملها.
تجربة وبيان الصيد تشكل وحدة. يقتصر نطاق شرط الصيد على البيان المحدد قبل بيان المحاولة. لا يمكن لبيان الصيد التقاط الاستثناء الذي أثاره بيان تجربة آخر (ما لم يكن قضية بيان المحاولة المتداخلة).
يجب أن تكون البيانات المحمية بموجب المحاولة ضمن دعامة (أي ، يجب أن تكون في كتلة). لا يمكنك استخدام المحاولة بمفردك.
الغرض من بناء جملة الصيد هو حل الاستثناءات والاستمرار في التشغيل كما لو أن الخطأ لم يحدث. على سبيل المثال ، في البرنامج التالي ، يتم تكرار كل حلقة للحصول على أعداد صحيحة عشوائية. يتم تقسيم هذين الأعداد الصحيحة على الطرف الآخر على التوالي ، ويتم استخدام النتيجة لتقسيم 12345. النتيجة النهائية موجودة في. إذا أدت عملية التقسيم إلى خطأ في تقسيم الصفر ، فسيتم التقاطها ، يتم تعيين قيمة A على الصفر ، ويستمر البرنامج في التشغيل.
. ) ؛ {system.out.println ("التقسيم بواسطة الصفر.") ؛إظهار وصف استثناء
يحمل الرمي الزائد طريقة ToString () (المحددة بواسطة الكائن) ، بحيث تقوم بإرجاع سلسلة تحتوي على وصف استثناء. يمكنك عرض وصف الاستثناء من خلال تمرير معلمة إلى الاستثناء في println (). على سبيل المثال ، يمكن إعادة كتابة كتلة الصيد في البرنامج السابق
catch (ArithMeticexception e) {system.out.println ("استثناء:" + e) ؛ عندما يستبدل هذا الإصدار الإصدار في البرنامج الأصلي ، يتم تشغيل البرنامج تحت مترجم Javajdk القياسي ، ويتم تقسيم كل خطأ على الصفر الذي يعرض الرسالة التالية:
الاستثناء: java.lang.arithmeticexception: / by Zero
على الرغم من عدم وجود قيم خاصة في السياق ، إلا أن القدرة على عرض وصف استثناء قيمة في حالات أخرى - خاصةً عند تجربة وتصحيح استثناء.
استخدام عبارة الصيد المتعددة Java <BR /> في بعض الحالات ، قد يكون سبب استثناءات متعددة من شريحة رمز واحد. للتعامل مع هذا الموقف ، يمكنك تحديد فترتين أو أكثر من جمل الصيد ، كل منها يمسك باستثناء نوع واحد. عند إثارة استثناء ، يتم التحقق من كل جملة الصيد بالتسلسل ، ويتم تنفيذ الشرط الأول الذي يطابق نوع الاستثناء. عند تنفيذ بيان الصيد ، يتم تجاوز جمل أخرى ، ويستمر التنفيذ من الكود بعد كتلة المحاولة/الصيد. المثال التالي يصمم نوعين من الاستثناءات المختلفة:
// إظهار عبارات الصيد المتعددة. ؛ Out .println ("Array Index OOB:" + E) ؛يعمل البرنامج في حالة البداية دون معلمات سطر الأوامر مما يؤدي إلى استثناء مقسّم صفريًا لأن A هو 0. إذا قمت بتقديم معلمة سطر الأوامر ، فستبقى على قيد الحياة ، مع تعيين قيمة أكبر من الصفر. ولكن سيؤدي ذلك إلى استثناء ArrayIndExOutof BoundSexception لأن مجموعة INTEGER C هي طول 1 ويحاول البرنامج تعيين قيمة لـ C [42].
فيما يلي إخراج البرنامج الذي يعمل في حالتين مختلفتين:
C:/> java multicatcha = 0divide by 0: java.lang.arithmeticexception:/by Zero بعد Try/catch blocks.c:/> java multicatch testarga = 1array index oob: j ava.lang.arrayindexoutofboundsexception بعد المحاولة.
عندما تستخدم بيانًا متعدد المسارات ، من المهم أن تتذكر أنه يجب استخدام الفئات الفرعية الاستثناء قبل أي من فئات الوالدين. وذلك لأن استخدام بيان الصيد الخاص بالفئة الأصل سوف يلتقط استثناءات للنوع وجميع أنواع الفئات الفرعية. وبهذه الطريقة ، إذا كانت الفئة الفرعية خلف فئة الوالدين ، فلن تصل الفئة الفرعية أبدًا. علاوة على ذلك ، فإن الكود الذي لا يمكن الوصول إليه في Java هو خطأ. على سبيل المثال ، فكر في الإجراء التالي:
/* يحتوي هذا البرنامج على خطأ. args []) {try {int a = 0 ؛ RithMeticexception هي فئة فرعية من الاستثناء.إذا حاولت تجميع البرنامج ، فستتلقى رسالة خطأ مفادها أن بيان الصيد الثاني لن يصل لأنه تم القبض على الاستثناء. نظرًا لأن ArithMeticexception هو فئة فرعية من الاستثناء ، فإن بيان الصيد الأول سوف يتعامل مع جميع الأخطاء الموجهة نحو الاستثناء ، بما في ذلك ArithMeticeSception. هذا يعني أنه لن يتم تنفيذ بيان الصيد الثاني. لتعديل البرنامج ، عكس ترتيب تصريحات الصيد.