الاستثناءات
الاستثناءات (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).
📖 ملخص
- try-catch لمعالجة الاستثناءات
- finally يتم تنفيذه دائمًا
- try-with-resources لإغلاق الموارد تلقائيًا
- throw لرمي استثناء
- throws لإعلان الاستثناءات
- يمكن تعريف استثناءات مخصصة
📝 تمارين
- آلة حاسبة: أضف معالجة أخطاء للقسمة على صفر والمدخلات غير الصحيحة
- قراءة ملف: اكتب دالة تقرأ ملفًا مع معالجة الأخطاء
- استثناء مخصص: أنشئ استثناء مخصص لتحقق من صحة العمر
الدرس التالي
في الدرس التالي، سنتعلم ممارسة البرمجة الكائنية — تطبيقات عملية.



