معالجة الأخطاء في Java: try/catch وما بعدها — دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في معالجة الأخطاء في Java



في عالم البرمجة، الأخطاء أمر لا مفر منه. تنشأ لأسباب مختلفة: إدخال غير صحيح من المستخدم، عدم توفر ملف، أخطاء في منطق البرنامج، أو أعطال في الشبكة. في لغة Java، توجد آلية قوية ومرنة لإدارة مثل هذه المواقف — وهي الاستثناءات (exceptions). المعالجة الصحيحة للأخطاء ليست مجرد سلوك جيد، بل هي ضمان لاستقرار تطبيقك وموثوقيته وأمانه.



في هذه المقالة، سنشرح بالتفصيل كيفية عمل معالجة الأخطاء في Java، بدءًا من البنية الأساسية try/catch وصولاً إلى التقنيات المتقدمة مثل try-with-resources وإنشاء الاستثناءات الخاصة بك. ستتعرف على الفرق بين الاستثناءات المُفحَصة (checked) وغير المُفحَصة (unchecked)، وكيفية استخدامها بشكل صحيح.



الأساسيات: بنية try/catch و finally



كتلة try و catch



قلب معالجة الاستثناءات في Java هو بنية try/catch. يتم وضع الكود الذي قد يُلقي استثناءً داخل كتلة try. إذا حدث استثناء في هذه الكتلة، ينتقل التنفيذ فورًا إلى كتلة catch المناسبة، حيث تتم معالجة هذا الاستثناء.



public class Main {    public static void main(String[] args) {        try {            int result = 10 / 0; // هذا سيُسبب ArithmeticException            System.out.println("النتيجة: " + result);        } catch (ArithmeticException e) {            System.out.println("خطأ: القسمة على صفر!");            e.printStackTrace(); // يطبع مكدس الاستدعاءات لتصحيح الأخطاء        }        System.out.println("البرنامج يواصل العمل...");    }}


لاحظ: السطر System.out.println("النتيجة: " + result); لن يتم تنفيذه، لأن الاستثناء حدث مبكرًا. لكن البرنامج لن "ينهار" — سينتقل التحكم إلى catch، وسيستمر التنفيذ بعد كتلة try/catch.



كتل catch متعددة



يمكن أن تحتوي كتلة try واحدة على عدة كتل catch لمعالجة أنواع مختلفة من الاستثناءات. من المهم تذكر أن الاستثناءات الأكثر تحديدًا يجب أن تُذكر قبل الاستثناءات الأكثر عمومية.



try {    String str = null;    System.out.println(str.length()); // NullPointerException    int[] arr = new int[5];    arr[10] = 100;                   // ArrayIndexOutOfBoundsException} catch (NullPointerException e) {    System.out.println("NullPointerException: " + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {    System.out.println("ArrayIndexOutOfBoundsException: " + e.getMessage());} catch (Exception e) { // معالج عام لجميع الاستثناءات الأخرى    System.out.println("خطأ عام: " + e.getMessage());}


كتلة finally



كتلة finally هي كتلة خاصة يتم تنفيذها دائمًا، بغض النظر عما إذا تم إلقاء استثناء أم لا. إنها مثالية لتحرير الموارد: إغلاق الملفات، اتصالات قاعدة البيانات، أو المقابس (sockets).



import java.io.*;

public class FileExample { public static void main(String[] args) { FileInputStream file = null; try { file = new FileInputStream("test.txt"); int data = file.read(); System.out.println((char) data); } catch (FileNotFoundException e) { System.out.println("الملف غير موجود!"); } catch (IOException e) { System.out.println("خطأ في الإدخال/الإخراج!"); } finally { try { if (file != null) { file.close(); // نغلق الملف في كل الأحوال } } catch (IOException e) { System.out.println("خطأ عند إغلاق الملف!"); } } }}


حتى إذا حدث استثناء في كتلة try أو catch

المدونات

توصيات الكتب