الاستثناءات

الاستثناءات (Exceptions) هي طريقة معالجة الأخطاء في Java. في هذا الدرس، سنتعلم كيفية التعامل معها.

أنواع الأخطاء

النوع الوصف مثال
Compile-time أخطاء أثناء الترجمة خطأ نحوي
Runtime أخطاء أثناء التشغيل قسمة على صفر
Logical أخطاء منطقية خوارزمية خاطئة

هيكل الاستثناءات

TEXT
Throwable
├── Error (أخطاء خطيرة — لا يمكن التعامل معها)
│   ├── OutOfMemoryError
│   └── StackOverflowError
└── Exception (استثناءات — يمكن التعامل معها)
    ├── IOException
    ├── SQLException
    └── RuntimeException
        ├── NullPointerException
        ├── ArrayIndexOutOfBoundsException
        └── ArithmeticException

try-catch

JAVA
try {
    // كود قد يسبب خطأ
    int result = 10 / 0;
} catch (ArithmeticException e) {
    // معالجة الخطأ
    System.out.println("خطأ: " + e.getMessage());
}

try-catch متعددة

JAVA
try {
    int[] numbers = {1, 2, 3};
    System.out.println(numbers[5]);  // خطأ مصفوفة
    int result = 10 / 0;  // خطأ قسمة
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("خطأ في فهرس المصفوفة: " + e.getMessage());
} catch (ArithmeticException e) {
    System.out.println("خطأ حسابي: " + e.getMessage());
} catch (Exception e) {
    System.out.println("خطأ عام: " + e.getMessage());
}

try-catch-finally

JAVA
try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("خطأ: " + e.getMessage());
} finally {
    // يتم تنفيذ هذا الكود دائمًا
    System.out.println("هذا الكود يتم تنفيذه دائمًا");
}

try-with-resources (Java 7+)

JAVA
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line = reader.readLine();
} catch (IOException e) {
    System.out.println("خطأ في القراءة: " + e.getMessage());
}
// reader يتم إغلاقه تلقائيًا

throw — رمي استثناء

JAVA
public static int divide(int a, int b) {
    if (b == 0) {
        throw new ArithmeticException("لا يمكن القسمة على صفر");
    }
    return a / b;
}

// الاستخدام
try {
    int result = divide(10, 0);
} catch (ArithmeticException e) {
    System.out.println(e.getMessage());  // لا يمكن القسمة على صفر
}

throws — إعلان الاستثناء

JAVA
public static void readFile(String filename) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader(filename));
    String line = reader.readLine();
    reader.close();
}

// الاستخدام
try {
    readFile("file.txt");
} catch (IOException e) {
    System.out.println("خطأ: " + e.getMessage());
}

استثناءات مخصصة

JAVA
// تعريف استثناء مخصص
public class InsufficientFundsException extends Exception {
    private double amount;
    
    public InsufficientFundsException(double amount) {
        super("رصيد غير كافٍ. المطلوب: " + amount);
        this.amount = amount;
    }
    
    public double getAmount() {
        return amount;
    }
}

// استخدام الاستثناء المخصص
public class BankAccount {
    private double balance;
    
    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException(amount - balance);
        }
        balance -= amount;
    }
}

// الاستخدام
BankAccount account = new BankAccount();
try {
    account.withdraw(1000);
} catch (InsufficientFundsException e) {
    System.out.println(e.getMessage());
    System.out.println("ينقص: " + e.getAmount());
}

أفضل الممارسات

الممارسة الوصف
كن محددًا اصطد الأنواع المحددة، ليس Exception عامًا
لا تتجاهل تعامل مع الاستثناءات دائمًا
سجل الأخطاء استخدم logging لتسجيل الأخطاء
نظف الموارد استخدم try-with-resources أو finally

❓ أسئلة شائعة

س ما الفرق بين Exception و RuntimeException؟
ج Exception يجب التعامل معها (checked). RuntimeException لا يجب التعامل معها (unchecked).
س متى أستخدم throw ومتى أستخدم throws؟
ج throw لرمي استثناء. throws لإعلان أن الدالة قد ترمي استثناء.
س هل يمكن أن تحتوي catch على عدة أنواع؟
ج نعم، منذ Java 7: catch (IOException | SQLException e).

📖 ملخص

📝 تمارين

  1. آلة حاسبة: أضف معالجة أخطاء للقسمة على صفر والمدخلات غير الصحيحة
  2. قراءة ملف: اكتب دالة تقرأ ملفًا مع معالجة الأخطاء
  3. استثناء مخصص: أنشئ استثناء مخصص لتحقق من صحة العمر

الدرس التالي

في الدرس التالي، سنتعلم ممارسة البرمجة الكائنية — تطبيقات عملية.

100%