try و catch في Java
غلّف قراءة slots[5] السيئة داخل try وcatch حتى لا ينتهي البرنامج عند ArrayIndexOutOfBoundsException. اطبع blocked داخل الـ catch، ثم اطبع after خارج الكتلتين. ترجم Guard.java ونفّذ java Guard. يجب أن تظهر الشاشة blocked ثم after. ملف ثانٍ يبقي slots[0] داخل try فيُتخطّى الـ catch وتظهر الشاشة 2 ثم after. اترك throw للصفحة التالية.
التقاط الفهرس السيئ
أظهرت صفحة الاستثناءات أن طباعة slots[5] على {2, 4} ترمي ArrayIndexOutOfBoundsException وتوقف التشغيل. هذه الصفحة تبقي قصة المصفوفة نفسها وتضيف المعالجة. افتح ملف تدريس جديدًا اسمه Guard.java. أبقِ اسم الفئة العامة Guard ليطابق اسم الملف. احذف دوال main المتبقية من Alarm التي تتوقف بلا catch، وقوائم Integer من Crate، وأي Scanner أو nextLine. يجب ألا ينتظر البرنامج الكتابة.
داخل main أبقِ المصفوفة الصغيرة نفسها:
int[] slots = {2, 4};
ضع الطباعة السيئة داخل try:
System.out.println(slots[5]);
ثم اكتب catch يسمّي ArrayIndexOutOfBoundsException ويطبع blocked. بعد كامل try وcatch اطبع after. يمكن أن يكون اسم معامل الـ catch حرفًا قصيرًا مثل e؛ لا تحتاج لطباعة كائن الاستثناء في هذه الصفحة.
public class Guard {
public static void main(String[] args) {
int[] slots = {2, 4};
try {
System.out.println(slots[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("blocked");
}
System.out.println("after");
}
}
من المجلد الذي يحوي Guard.java نفّذ javac Guard.java. عندما تتطابق الأقواس والدواليب والفواصل المنقوطة، لا يكتب javac سطرًا من عنده. ثم نفّذ java Guard — لا java Guard.java. احذف لاحقة .java من أمر التشغيل.
تظهر الشاشة blocked ثم after. الفهرس السيئ ما زال يرمي داخل try. الـ catch يعالج ذلك الاستثناء المسمّى ويطبع blocked. سطر System.out.println("after"); خارج الكتل، فيجري أيضًا. لا ينتهي البرنامج عند ذلك التوقف كما فعل ملف Alarm السيئ العاري.
تخيّل طباعة ثانية ما زالت داخل try بعد slots[5]، مثل سطر يطبع rice. ذلك السطر لا يعمل. التقاط الاستثناء لا يعود ليُكمل بقية try. يعمل جسم الـ catch لذلك التوقف فقط، ثم يستمر التحكم بعد الـ catch. أبقِ الفكرة واضحة: المعالجة تتخطّى الأسطر المتبقية داخل try بعد نقطة الرمي.
إذا انتظرت الطرفية إدخال لوحة المفاتيح، فما زال استدعاء nextLine من تمرين قديم في ملف. احذفه. إن رأيت تقرير مكدّس فقط بلا سطر blocked، فالـ catch ناقص أو اسم الاستثناء غير مطابق. إن رأيت 2 وحده بلا after، فربما ما زلت تشغّل ملف Alarm الآمن القديم — انتقل إلى java Guard بملف تدريس الـ catch.
عندما يكتمل try يبقى catch صامتًا
برنامج ثانٍ يستخدم نفس شكل try وcatch، لكن الطباعة داخل try تطلب خانة مكتوبة: slots[0]. تكتمل كل الأسطر داخل try. جسم الـ catch لا يعمل.
public class Guard {
public static void main(String[] args) {
int[] slots = {2, 4};
try {
System.out.println(slots[0]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("blocked");
}
System.out.println("after");
}
}
ترجم بـ javac Guard.java ثم نفّذ java Guard. تظهر الشاشة 2 ثم after. كلمة blocked لا تُطبع، لأنه لم يحدث ArrayIndexOutOfBoundsException. بقي الـ catch صامتًا. سطر after يجري أيضًا لأنه خارج الكتلتين — نفس الموضع الذي كان في عرض الـ catch.
امشِ المقارنة مرة. الملف الأول: فهرس سيئ، الـ catch يطبع blocked ثم after. الملف الثاني: فهرس آمن، الـ catch متخطّى، الشاشة 2 ثم after. كلاهما يبقي Guard ونفس اسم نوع الـ catch. يتغيّر فقط الفهرس داخل try. ذلك التغيير الواحد يكفي لإظهار متى يعمل الـ catch ومتى لا يعمل.
لا تخترع عبارة throw في هذه الصفحة. أنت تلتقط استثناءً تسبّبه قراءة مصفوفة سيئة أصلًا. الصفحة التالية عن الرمي عمدًا. ولا تلفّ كل طباعة هادئة في الدورة داخل try اليوم — هذا الدرس يستخدم try حيث يحتاج فهرس سيئ معروف مسارًا معالَجًا.
اسم الـ catch يجب أن يطابق
بند الـ catch يسمّي نوع استثناء واحد. في هذه الصفحة النوع هو ArrayIndexOutOfBoundsException مطابقًا للفهرس السيئ. إن كتبت catch (NullPointerException e) حول slots[5] بدلًا من ذلك، فذلك الـ catch لن يعالج التوقف. سينتهي البرنامج ما زال بـ ArrayIndexOutOfBoundsException، ولن يُطبع لا blocked ولا after لذلك الـ catch غير المطابق. أبقِ النوع المطابق في ملفات التدريس.
توجد أسماء استثناء أخرى في Java. هذه الصفحة تبقي زوجًا واضحًا واحدًا: فهرس مصفوفة سيئ وArrayIndexOutOfBoundsException. لا تحتاج كتالوج كل نوع قابل للالتقاط قبل تمرين هذا الشكل. طابق الاسم الذي رأيته في صفحة الاستثناءات.
مقارنة مع توقف Alarm العاري
في صفحة الاستثناءات توقف java Alarm مع slots[5] وأظهر تقرير مكدّس. في هذه الصفحة يطبع java Guard مع نفس الفهرس السيئ blocked ويستمر إلى after. قصة المصفوفة لم تتغيّر. المعالجة تغيّرت. أبقِ ملفات Alarm كتاريخ إن بقيت قريبة؛ نفّذ java Guard لعروض الـ catch حتى تطابق الشاشة هذا الدرس.
تاريخ wrappers ما زال يطبع 9 من قائمة Integer إن أبقيت ذلك الملف القديم. ذلك المسار ليس قصة الـ catch. احذف أو تجاهل بقايا عروض ArrayList<Integer> داخل Guard.java ليبقى ملف التدريس على int[] slots مع try وcatch.
ما تتركه هذه الصفحة للـ throwing
هذه الصفحة تلتقط استثناءً يصطدم به سطر أصلًا. الصفحة التالية تقدّم throw لتُعلن مشكلة بنفسك. ابقَ هنا مع مطابقة catch ورؤية استمرار after. لا تضف throw يدويًا كمتطلب على ملفات Guard هذه بعد.
قبل الـ throwing
يمكنك التقاط ArrayIndexOutOfBoundsException من slots[5] ورؤية blocked ثم after. يمكنك إبقاء slots[0] داخل try ورؤية 2 ثم after مع تخطّي الـ catch. ترجم Guard.java ونفّذ java Guard لكل عرض محفوظ بالدور. طابق اسم الـ catch توقف الفهرس السيئ. الصفحة التالية هي throwing، حيث تُسبب توقفًا عمدًا.
أبقِ عرض الـ catch لمسار معالَج. أبقِ الـ try الآمن لتخطّي هادئ للـ catch. أبقِ throw اليدوي خارج هذه الصفحة. تلك العادات الثلاث نقطة تفتيش قبل المتابعة. عندما يظهر blocked ثم after بعد تشغيل الفهرس السيئ لـ java Guard، يكون try و catch قد أدّيا عملهما لهذا الدرس وأنت جاهز للموضوع التالي عن الرمي.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى