أخطاء وقت التشغيل

بعيداً جداً في القسم 1.3.1، تحدثت عن أخطاء التشغيل (run-time errors)، وهي أخطاء لا تظهر قبل بدء البرنامج بالعمل. تدعى أخطاء التشغيل في Java بالاستثناءات (exceptions).
الأغلب أنك لم تر العديد من أخطاء التشغيل حتى الآن، لأننا لم نفعل أي أشياء تؤدي إلى ذلك. حسن، الآن نحن نفعل ذلك. إذا استخدمت أمر charAt وأعطيته دليلاً سالباً أو أكبر من length-1، فستحصل على استثناء: بشكل محدد، ستحصل على StringIndexOutOfBoundsExeption. جرب وانظر كيف سيبدو.
إذا تسبب برنامجك باستثناء، سيطبع رسالة خطأ تبين نوع الاستثناء بالإضافة إلى سجل المكدس (stack trace)، الذي يبين العملية التي كانت تجري وقت حدوث الاستثناء. إليك مثالاً:
كود:
public class BadString {
   public static void main(String[] args) {
      processWord("banana");
   }
 
   public static void processWord(String s) {
      char c = getLastLetter(s);
      System.out.println(c);
   }
 
   public static char getLastLetter(String s) {
      int index = s.length();        // WRONG!
      char c = s.charAt(index);
      return c;
   }
}
لاحظ الخطأ في getLastLetter: يجب أن يكون دليل آخر حرف s.length()-1. إليك ما ستحصل عليه:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 6
at java.lang.String.charAt(String.java:694)
at BadString.getLastLetter(BadString.java:24)
at BadString.processWord(BadString.java:18)
at BadString.main(BadString.java:14)
بعدها ينتهي البرنامج. قد تكون قراءة سجل المكدس صعبة، لكنه يحتوي على الكثير من المعلومات.

تمرين 8.2

اقرأ سجل المكدس وأجب عن الأسئلة التالية:
· ما هو نوع الاستثناء الحاصل، وما هي الحزمة التي عرِّف فيها؟
· ما هي قيمة الدليل التي سببت الاستثناء؟
· ما هي العملية التي أطلقت الاستثناء (threw the exception)، وأين تم تعريف تلك العملية؟
· ما هي العملية التي استدعت charAt؟
· في BadString.java، ما هو رقم السطر الذي استدعيت فيه العملية charAt؟