الوحدة 5: الأخطاء والملفات · الموضوع 11 من 17
الموضوع 11

الاستثناءات Exceptions

نحمي البرنامج من التوقّف المفاجئ عند حدوث خطأ أثناء التشغيل، ونتعامل معه بطريقة منظّمة وآمنة.

trymyNumbers[10] ! catch (Exception e)
بعد هذا الدرس ستستطيع أن:
  • تميّز بين الأخطاء النحوية Syntax errors وأخطاء وقت التشغيل Runtime errors.
  • تصنّف الاستثناءات إلى Checked و Unchecked و Error مع مثال لكل منها.
  • تعالج الاستثناء باستخدام try و catch و finally.
  • تكتب أكثر من catch مرتّبة من الأخص إلى الأعم.

١ما هو الاستثناء؟

خطأ غير متوقع يحدث أثناء تنفيذ البرنامج، فيوقف التنفيذ عند أول خطأ ولا يكمل بقية التعليمات. مثل: القسمة على صفر، أو الوصول إلى عنصر غير موجود في مصفوفة.

الهدف من نظام الاستثناءات: التقاط الخطأ ومعالجته ليستمر البرنامج إلى آخر تعليمة.

أخطاء نحوية Syntax Errorsأخطاء وقت التشغيل Runtime Errors
متى تُكتشف؟أثناء الترجمة Compile Timeأثناء تشغيل البرنامج
أمثلةنسيان الفاصلة المنقوطة، خطأ في حالة الأحرفالقسمة على صفر، عنصر غير موجود في مصفوفة
التعامل معهاتصحيح الكودالاستثناءات try / catch

٢أقسام الاستثناءات

ThrowableErrorExceptionRuntime ExceptionsOther Exceptions أخطاء خارجية لا علاقةللبرنامج بهاUncheckedChecked
Throwable هو الأساس لجميع الأخطاء. و Exception هو الأساس لجميع الاستثناءات: ما يرث RuntimeException غير متحقق Unchecked، والباقي متحقق Checked.

١) Checked Exception: الاستثناء المتحقق

يتحقق منه المترجِم ويُلزمك بالتعامل معه قبل التشغيل: بـ try-catch، أو بالتصريح عنه بـ throws. أمثلة: IOException و FileNotFoundException.

Student.java
package exception; import java.io.FileReader; public class Student {     public static void main(String[] args) {        FileReader file = new FileReader("data.txt");    } }
رسالة NetBeans×
unreported exception FileNotFoundException; must be caught or declared to be thrown
الحل الأول: throws
Student.java
package exception; import java.io.FileNotFoundException;import java.io.FileReader; public class Student {     public static void main(String[] args) throws FileNotFoundException {         FileReader file = new FileReader("data.txt");    } }
الحل الثاني: try-catch
Student.java
package exception; import java.io.FileNotFoundException;import java.io.FileReader; public class Student {     public static void main(String[] args) {        try {            FileReader file = new FileReader("data.txt");        }        catch (FileNotFoundException ex) {            System.out.println(ex.getMessage());        }    } }

في NetBeans يقترح المصباح الحلّين: Add throws clause أو Surround Statement with try-catch.

٢) Unchecked Exception: غير المتحقق (Runtime Exception)

لا يتحقق منه المترجِم، بل يظهر وقت التشغيل، والمبرمج غير مُلزم بمعالجته. ينتج عادةً عن أخطاء منطقية:

Main.java
public class Main {    public static void main(String[] args) {        int[] myNumbers = {1, 2, 3};        System.out.println(myNumbers[10]);   // error!    }}
Output – (run)×
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
الجانبCheckedUnchecked
وقت الفحصأثناء الترجمةأثناء التشغيل
إلزام المعالجةإلزامياختياري
أمثلةIOException, SQLExceptionNullPointerException, ArithmeticException

٣) Error

خطأ بسبب حدود الجهاز الذي يعمل عليه البرنامج، ولا يرتبط بالبرنامج مباشرة؛ مثل امتلاء الذاكرة: «JVM is out of memory».

٣معالجة الاستثناءات: try و catch و finally

الكتلةوظيفتها
tryنكتب فيها الكود الذي نتوقع أن يسبب خطأ؛ فإذا وقع الخطأ «ترمي» الاستثناء.
catchتلتقط الاستثناء الذي رمته try وتعالجه، ثم يستمر التنفيذ بعدها.
finallyتُنفَّذ دائمًا سواء حدث استثناء أم لا؛ مثل إغلاق ملف أو اتصال بقاعدة بيانات.
الصيغة العامة
try {    // الكود الذي قد يسبب استثناء}catch (Exception e) {    // التعامل مع الخطأ}finally {    // (اختياري) كود يتم تنفيذه دائمًا}

مثال الدرجات

Main.java
package exception;import java.util.Scanner;public class Main {    public static void main(String[] args) {        double marks [] = {90, 88.50, 77, 100, 50};        Scanner scan = new Scanner(System.in);        int idx;        try {            System.out.print("Enter an index number.(0 to 4): ");            idx = scan.nextInt();            System.out.println("The mark is: " + marks[idx]);        }        catch (Exception e) {            System.out.println(e);        }        finally {            System.out.println("finally block");        }        System.out.println("After try and block");    }}
Output – JavaApplication (run)×
run:
Enter an index number.(0 to 4): The mark is: 50.0
finally block
After try and block
BUILD SUCCESSFUL (total time: 0 seconds)

أدخل 4 فيطبع الدرجة 50.0. جرّب إدخال 5 فيلتقط catch الخطأ ArrayIndexOutOfBoundsException ويكمل البرنامج.

أكثر من catch: لكل خطأ رسالة

Main.java
package exception;import java.util.InputMismatchException;import java.util.Scanner;public class Main {    public static void main(String[] args) {        double marks [] = {90, 88.50, 77, 100, 50};        Scanner scan = new Scanner(System.in);        int idx = 0;        try {            System.out.print("Enter an index number.(0 to 4): ");            idx = scan.nextInt();            System.out.println("The mark is: " + marks[idx]);        }        catch (ArrayIndexOutOfBoundsException e) {            System.out.println("ERROR: the number " + idx +" is out of range");        }        catch(InputMismatchException e){            System.out.println("ERROR: the number you entered is not an integer number");        }        catch(Exception e){            System.out.println("ERROR: " + e);        }        finally {            System.out.println("finally block");        }        System.out.println("After try and block");    }}
Output – JavaApplication (run)×
run:
Enter an index number.(0 to 4): ERROR: the number you entered is not an integer number
finally block
After try and block
BUILD SUCCESSFUL (total time: 0 seconds)
التدريب العملي 16: Checked و Unchecked في برنامج واحدFileReader يتطلب معالجة إلزامية، ثم ثلاثة استثناءات وقت التشغيل حسب ما يُدخله المستخدم.افتح التدريب ←

توقّع وتحقّق

أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.

أي كتلة تُنفَّذ دائمًا سواء حدث خطأ أم لا؟

FileNotFoundException من نوع:

نسيان الفاصلة المنقوطة:

ما الناتج إذا أدخل المستخدم 5 في مثال الدرجات الثاني؟

الخلاصة

انتقل إلى تقييم الدرسأسئلة التقييم، وأكمل الفراغات.ابدأ التقييم ←