المقدمة
الـ Exception Handling من الأساسيات في تعلم أي لغة ، وده لانك وانت شغال أكيد هيقابلك سيناريوهات هتضطر تـ Throw فيها Exceptions ، واحيانًا هتلاقيهم في وشك وأنت مش عارف ليه ، فلازم تكون فاهمهم كويس وعارف تتعامل معاهم ازاي.
فورقة وقلم وتعالوا نتعرف على الـ Java Exceptions و إزاي بنعملها Handeling بطريقة سليمة.
الكود عبارة عن "سيناريو" بينفذه الكمبيوتر وفي أي سيناريو ممكن تحصل مشكلة أو حدث غير متوقع ودا بيكون استثناء للسيناريو اللي يعرفه.
في الحالة دي الكمبيوتر مش هيعرف يتصرف وهيعمل Program Crash وعشان نتفادى دا لازم نعلم الكمبيوتر إزاي يتعامل مع الاستثناءات دي.
ال Exceptions أو الاستثناءات دي في ال Java بتنقسم ل 3 أنواع:
- الـ Checked Exceptions
النوع دا من ال Exceptions بيتم فحصه والتأكد من عدم وجوده في ال Compile time وهنا ال Java Compiler بيديك تحذير من وجوده وبيقولك اعمله handle بدل ما يوقعلنا البرنامج. ومن أشهرها الـ IOException, SQLException
- الـ Unchecked Exceptions
ودي Exceptions أسوء من ال checked لسببين:
- مبنعرفش بوجودها غير في وقت تشغيل البرنامج فعلاً ولذلك بتكون كلها من نوع Runtime Exceptions
- ال Exceptions دي بتكون نتيجة لأخطاء برمجية, يعني المبرمج كان ممكن يتفادها ويحلها لو بستخدم Good Programming Practices بس دا محصلش والجافا مشهورة بال Null pointer exception الناتج من محاولة تنفيذ عملية علي Object غير موجود, واللي ببساطة بيتحل لو المبرمج عمل تأكيد على وجود ال object قبل ما ينفذ عليه أي عملية هتؤدي لهذا ال Exception.
ومن أشهرهم كذلك:
- الـ ArithmeticException
- الـ IllegalArgumentException
- الـ IndexOutOfBoundsExceptions
- الـ Errors
هنا ال Errors بتشير للأخطاء اللي بتحصل خارج نطاق البرنامج بتاعنا ولكنها بتؤدي في النهاية انه يحصله crash و من أشهرها ال Out of memory Exception و Stack overflow Exception

Exception Class Hierarchy
مننساش إن ال Java هي OOP Language ولذلك كل ال Exceptions بتورث من ال Throwable Interface ومن هنا بتيجي كلمة "رمي اكسبشن" ال Interface دي بتضمن إن كل Exception يبقي عنده Error Message و Stack Track
ال Throwable Interface بينفذها 2 classes وهما ال Exceptions ودا اللي بيعبر عن ال Checked and Unchecked classes و ال Error Class اللي اتكلمنا عنه.
وكل الـ Exceptions اللي بنستخدمها بتورث من واحد من الاتنين دول.
و طبعًا تقدروا تكتبوا Customized Exceptions بتحل مشاكل مخصصة في المشاريع بتاعتكم.
كيفية التعامل مع الاستثناءات Error Handling
Try Catch Block
في حالة تحقق ال exception بالفعل ال try catch block بتعمل الكود اللي بنكتبهلنا وبتتفادى ال program crash.
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // This will throw an ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Array index is out of bounds!");
}Use Throws Keyword
كلمة throws هي كلمة مفتاحية Keyword نقدر نحطها في تعريف ال function عشان نعرف المستخدم للـ function إنها بترمي ال Exception دا فيعمله Handling بنفسه.
هنا إحنا بننقل ال Exception Handling لمكان تاني غير مكان حدوثه ودا عادي في ال Java لأن ال Compiler هيعدي علي كل ال Stack اللي تم منادة الكود فيه لحد ما يلاقي طريقة لحل ال Exception وفي حالة وصل لل Main وملقاش وقتها هيرمي ال Exception ويحصل Program Crash.
public void readFile(String filename) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line = reader.readLine();
System.out.println(line);
reader.close();
}Finally
في بعض الأحيان بيكون في كود لازم ننفذه سواء حصل Exceptions في الطريق للكود دا أو لاء, مثال مهم هو فكرة "تحرير الموارد" Free Resource
خلينا نوضحها بمثال:
احنا فتحنا ملف عشان نقرأ منه معلومات معينة و فتحنا الملف بنجاح ولكن عملية القراءة حصل فيها مشكلة وضربت Exception و البرنامج قفل قبل ما نقفل الملف, هنا إحنا عندنا مشكلة إن الملف فضل مفتوح وبالتالي هيمنع أي process تانية علي الجهاز إنها تستخدمه. إذا لازم أقفل أي مورد هستخدمه سواء البرنامج بتاعي كمل أو لاء
هنا يجي دور ال Finally واللي بنضفها علي ال Try Catch Block و الكود اللي فيها هيتنفذ في كل الاحوال سواء حصل Exceptions أو البرنامج كمل في أمان.
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("file.txt"));
String line = reader.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("An error occurred while reading the file.");
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}في الختام
الـ Exception Handling واحدة من المهارات اللي محتاجين كمطورين نكون فاهمينها كويس ، وده لإن مفيش برنامج أو تطبيق بيخلوا من الاستثناءات ، ده بالإضافة لإن فهمنا ليهم وآلية التعامل معاهم هيسهل علينا الـ Debugging بعد كده واننا نعرف نـ Troubleshoot أي مشاكل بتظهرلنا بعد كده بشكل أسهل كتير من عدم معرفتنا بيهم وبطرق التعامل معاهم.
Discussion