الاستثناءات في Java
احتفظ بمصفوفة int صغيرة اسمها slots تحمل 2 و4. اطبع slots[0] حتى تظهر الشاشة 2. ثم تعلّم ماذا يحدث إن طلبت slots[5] بدلًا من ذلك: Java ترمي ArrayIndexOutOfBoundsException ويتوقف البرنامج. ترجم أولًا Alarm.java ونفّذ java Alarm للملف الآمن. رؤية توقف وقت التشغيل من قاعدة مكسورة — لا من فاصلة منقوطة ناقصة — هو ما تعلّمه هذه الصفحة. اترك try وcatch للصفحة التالية.
قراءة آمنة تكتمل
الاستثناء هو طريقة Java لتقول إن قاعدة انكسرت أثناء تشغيل البرنامج. حتى الآن كانت أغلب العروض تطبع سطرًا واضحًا وتنتهي بهدوء. هذه الصفحة تبقي أولًا عرضًا هادئًا، ثم عرضًا يتوقف باسم استثناء.
افتح Alarm.java. أبقِ اسم الفئة العامة Alarm ليطابق اسم الملف. احذف بقايا ArrayList<Integer> وnums.add(9) وعروض Crate وأي for-each على oak وpine. احذف أيضًا أي Scanner أو nextLine. يجب ألا ينتظر البرنامج الكتابة. هذه الصفحة لا تحتاج سطر import.
داخل main خزّن عددين صحيحين:
int[] slots = {2, 4};
ثم اطبع الخانة الأولى:
System.out.println(slots[0]);
أرقام الخانات تبدأ من الصفر. الخانة صفر تحمل 2. احفظ قبل الترجمة.
public class Alarm {
public static void main(String[] args) {
int[] slots = {2, 4};
System.out.println(slots[0]);
}
}
من المجلد الذي يحوي Alarm.java نفّذ javac Alarm.java. عندما تتطابق الأقواس والدواليب والفواصل المنقوطة، لا يكتب javac سطرًا من عنده. ثم نفّذ java Alarm — لا java Alarm.java. احذف لاحقة .java من أمر التشغيل.
يجب أن يطبع البرنامج سطرًا واحدًا ويتوقف: 2. لا يطلب منك الكتابة. إذا انتظرت الطرفية إدخال لوحة المفاتيح، فما زال استدعاء nextLine من تمرين قديم في ملف. احذف ذلك الاستدعاء وأبقِ المصفوفة مع System.out.println(slots[0]);.
امشِ التشغيل مرة. تبدأ Java من Alarm.main. المصفوفة تحمل قيمتين. الطباعة تقرأ الخانة صفر. الشاشة تظهر 2. لا يجب أن يطبع شيء آخر. إن رأيت 9 فما زال عرض wrappers من Crate يعمل — انتقل إلى java Alarm. إن رأيت 4 فقد طبعت slots[1]؛ ملف التدريس الآمن يبقي slots[0].
فهرس سيئ يرمي
غيّر سطر الطباعة فقط ليطلب خانة لم تُكتب قط: slots[5]. المصفوفة ما زالت بخانتين فقط. في وقت التشغيل ترمي Java استثناءً بدل طباعة رقم.
public class Alarm {
public static void main(String[] args) {
int[] slots = {2, 4};
System.out.println(slots[5]);
}
}
ترجم بـ javac Alarm.java ثم نفّذ java Alarm. هذه المرة لا يطبع البرنامج 2. تظهر الطرفية تقرير خطأ يسمّي ArrayIndexOutOfBoundsException. يتوقف التشغيل. أسطر كنت تتخيّلها بعد تلك الطباعة لا تُنفَّذ، لأن الاستثناء أوقف البرنامج. لاحظ أن javac قد ينجح مع ذلك — الفهرس السيئ مشكلة وقت تشغيل، لا فاصلة منقوطة ناقصة.
ذلك التوقف هو الدرس. أنت لا تصلح الفهرس في هذه الصفحة بـ try. أنت تتعلّم أن قاعدة مكسورة في وقت التشغيل تصبح استثناءً وتنهي المسار العادي. اقرأ اسم الاستثناء في التقرير. أبقِ ملف الفهرس السيئ فقط لرؤية ذلك التوقف. فضّل الملف الآمن عندما تريد شاشة هادئة بـ 2. إن أعدت الفهرس السيئ إلى slots[0] تعود الشاشة الهادئة؛ يثبت ذلك أن التوقف جاء من الفهرس لا من اسم الفئة Alarm.
لا تعامل تقرير المكدس كنتيجة println عادية. Java تخبرك بما حدث خطأ. إملاء نوع الاستثناء مهم عندما تتحدث عنه: ArrayIndexOutOfBoundsException. قول «خطأ» وحده مبهم لهذا الدرس — أبقِ الاسم الكامل للنوع عندما تصف التوقف.
بقايا wrappers ليست هذا الانهيار
ملف ثالث يذكّرك بقائمة Integer من الصفحة السابقة. ذلك العرض يطبع 9 وينتهي. ليس قصة الاستثناء.
import java.util.ArrayList;
public class Alarm {
public static void main(String[] args) {
ArrayList<Integer> nums = new ArrayList<Integer>();
nums.add(9);
System.out.println(nums.get(0));
}
}
ذلك التباين يطبع 9 وينتهي دون رمي. استخدمه فقط لفصل مسار wrappers المكتمل عن مسار Alarm ذي الفهرس السيئ. لدرس الاستثناءات في هذه الصفحة، زوج التدريس هو طباعة slots[0] الآمنة وطباعة slots[5] التي ترمي. لا تخترع try أو catch حول أي من عروض المصفوفة في هذه الصفحة أصلًا.
مقارنة بالمصفوفات وبـ wrappers
في صفحة المصفوفات بقيت داخل الخانات المكتوبة. هذه الصفحة تخرج عمدًا حتى ترى الاستثناء. في صفحة wrappers طبعت قائمة Integer القيمة 9 دون انهيار. ذلك ما زال يعمل كتاريخ. لهذه الصفحة أبقِ Alarm وقصة فهرس المصفوفة.
توجد استثناءات أخرى — مثلًا القسمة على صفر قد ترمي ArithmeticException. هذه الصفحة تبقي اسمًا واضحًا واحدًا: ArrayIndexOutOfBoundsException من فهرس سيئ. لا تحتاج اليوم كتالوج كل أنواع الاستثناء. مثال واحد متين يكفي قبل أن تعلّم الصفحة التالية المعالجة.
عندما تبقى ملفات Crate.java القديمة قريبة، اتركها أو احذفها فقط إن شوّشت أي فئة تشغّل. نفّذ java Alarm بعد ترجمة ملف العرض المقصود. بدّل الملفات عمدًا حتى لا تختلط الطباعة الآمنة والطباعة الراميّة في main واحد أثناء الدراسة.
ما يبقى لـ try و catch
تُظهر هذه الصفحة أن استثناءً يمكن أن يوقف البرنامج في وقت التشغيل. الصفحة التالية تقدّم try وcatch حتى تعالج بعض المشكلات دون إنهاء التشغيل كله. ابقَ هنا مع التعرف على التوقف واسم الاستثناء. لا تخترع كتلة catch كشرط في هذه الصفحة بعد.
قبل try و catch
يمكنك طباعة slots[0] من {2, 4} ورؤية 2. يمكنك طباعة slots[5] ورؤية توقف التشغيل مع ArrayIndexOutOfBoundsException. ترجم Alarm.java ونفّذ java Alarm لكل عرض محفوظ بالدور. سمّى الاستثناء القاعدة المكسورة بوضوح. الصفحة التالية هي try و catch، حيث يمكن لمسار معالَج أن يستمر بعد بعض الأخطاء.
أبقِ العرض الآمن لشاشة هادئة. أبقِ الفهرس السيئ لرؤية التوقف. أبقِ try خارج هذه الصفحة. تلك العادات الثلاث نقطة فحص قبل المتابعة. عندما تستطيع تسمية ArrayIndexOutOfBoundsException بعد تشغيل الفهرس السيئ بـ java Alarm، أدّت الاستثناءات عملها لهذا الدرس وأنت جاهز للموضوع التالي عن المعالجة.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى