الاستثناءات (Exceptions) في جافا

Amine
30/09/2024

ما هي الاستثناءات (Exceptions) في جافا؟

الاستثناءات (Exceptions) في جافا هي آلية تُستخدم للتعامل مع الأخطاء والمشكلات التي قد تحدث أثناء تشغيل البرنامج. الاستثناءات تُظهر رسالة خطأ عندما يحدث شيء غير متوقع في البرنامج، مثل القسمة على صفر، أو محاولة الوصول إلى عنصر غير موجود في المصفوفة، أو حدوث خطأ في إدخال أو إخراج الملفات.

أنواع الاستثناءات في جافا

في جافا، هناك نوعان رئيسيان من الاستثناءات:

  • **Checked Exceptions:** هي الاستثناءات التي يتم اكتشافها والتحقق منها أثناء عملية الترجمة (Compile Time). مثل استثناءات الإدخال/الإخراج (IOException).
  • **Unchecked Exceptions:** هي الاستثناءات التي تحدث أثناء وقت التشغيل (Runtime)، مثل القسمة على صفر أو الوصول إلى عنصر غير موجود في المصفوفة (ArrayIndexOutOfBoundsException).

كيفية التعامل مع الاستثناءات في جافا

يمكنك التعامل مع الاستثناءات باستخدام العبارات try و catch و finally. الصيغة العامة هي:

try {
   // الكود الذي قد يُسبب استثناء
} catch (ExceptionType e) {
   // الكود الذي سيتم تنفيذه عند حدوث الاستثناء
} finally {
   // الكود الذي سيتم تنفيذه سواء حدث الاستثناء أم لم يحدث (اختياري)
}

مثال:

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

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

إلقاء الاستثناءات (Throwing Exceptions)

يمكنك إلقاء استثناءات باستخدام الكلمة المفتاحية throw، مما يسمح لك بإنشاء استثناءات مخصصة أو إلقاء استثناء موجود مسبقًا. الصيغة العامة هي:

throw new ExceptionType("رسالة الخطأ");

مثال:

public class Main {
   public static void checkAge(int age) {
      if (age < 18) {
         throw new IllegalArgumentException("العمر يجب أن يكون 18 أو أكثر");
      } else {
         System.out.println("مرحبًا بك في النظام!");
      }
   }

   public static void main(String[] args) {
      checkAge(15);  // سيُسبب استثناءً بسبب العمر
   }
}

في هذا المثال، قمنا بإنشاء دالة checkAge التي تتحقق من عمر المستخدم. إذا كان العمر أقل من 18، يتم إلقاء استثناء باستخدام throw، وإلا يتم طباعة رسالة ترحيب.

إنشاء استثناءات مخصصة (Custom Exceptions)

يمكنك إنشاء استثناءات مخصصة بتعريف فئة جديدة ترث من Exception أو أي من الفئات الفرعية لها. الصيغة العامة هي:

class CustomException extends Exception {
   CustomException(String message) {
      super(message);
   }
}

مثال:

class InvalidAgeException extends Exception {
   InvalidAgeException(String message) {
      super(message);
   }
}

public class Main {
   public static void checkAge(int age) throws InvalidAgeException {
      if (age < 18) {
         throw new InvalidAgeException("العمر غير صالح. يجب أن يكون 18 أو أكثر.");
      } else {
         System.out.println("مرحبًا بك في النظام!");
      }
   }

   public static void main(String[] args) {
      try {
         checkAge(15);  // سيُسبب استثناءً مخصصًا
      } catch (InvalidAgeException e) {
         System.out.println(e.getMessage());  // طباعة رسالة الخطأ
      }
   }
}

في هذا المثال، قمنا بإنشاء استثناء مخصص InvalidAgeException يحتوي على رسالة خطأ محددة. إذا كان عمر المستخدم أقل من 18، يتم إلقاء الاستثناء المخصص، ثم التعامل معه في الكتلة catch.

عبارة try-with-resources في جافا

عبارة try-with-resources تُستخدم لإدارة الموارد مثل الملفات وقواعد البيانات. تقوم هذه العبارة بإغلاق الموارد تلقائيًا بعد استخدامها، مما يساعد في تجنب تسريبات الذاكرة (Memory Leaks). الصيغة العامة هي:

try (ResourceType resource = new ResourceType()) {
   // الكود الذي يستخدم الموارد
} catch (ExceptionType e) {
   // التعامل مع الاستثناء
}

مثال:

import java.io.FileWriter;
import java.io.IOException;

public class Main {
   public static void main(String[] args) {
      try (FileWriter file = new FileWriter("example.txt")) {
         file.write("مرحبًا بك في جافا!");
      } catch (IOException e) {
         System.out.println("حدث خطأ أثناء الكتابة في الملف: " + e.getMessage());
      }
   }
}

في هذا المثال، يتم فتح ملف باستخدام FileWriter داخل عبارة try-with-resources، وسيتم إغلاق الملف تلقائيًا بعد انتهاء الكود داخل الكتلة.

تمرين (مستوى متوسط): إنشاء برنامج للتحقق من القسمة على صفر

في هذا التمرين، سنقوم بإنشاء برنامج يتحقق من المدخلات ويُظهر رسالة خطأ عند محاولة القسمة على صفر.

المتطلبات:

  • إنشاء دالة divide تقبل رقمين كمدخلات.
  • إذا كان المقام يساوي صفرًا، قم بإلقاء استثناء ArithmeticException.
  • قم بالتعامل مع الاستثناء باستخدام try و catch.
  • اطبع رسالة خطأ إذا حدث الاستثناء، أو قم بطباعة النتيجة إذا كانت القسمة ناجحة.

الكود:

public class Main {
   public static void divide(int numerator, int denominator) {
      if (denominator == 0) {
         throw new ArithmeticException("لا يمكن القسمة على صفر!");
      } else {
         System.out.println("الناتج: " + (numerator / denominator));
      }
   }

   public static void main(String[] args) {
      try {
         divide(10, 0);  // محاولة القسمة على صفر
      } catch (ArithmeticException e) {
         System.out.println(e.getMessage());  // طباعة رسالة الخطأ
      }
   }
}

شرح الكود:

  • قمنا بإنشاء دالة divide للتحقق من القسمة على صفر وإلقاء استثناء ArithmeticException عند حدوث ذلك.
  • قمنا بالتعامل مع الاستثناء في الكتلة catch، ثم طباعة رسالة الخطأ.

جرّب تنفيذ هذا البرنامج بنفسك، وشارك نتيجتك معنا في التعليقات! إذا واجهتك أي مشكلة أو كان لديك سؤال، لا تتردد في طرحه.

خاتمة

في هذا الدرس، تعرفنا على كيفية التعامل مع الاستثناءات في جافا، وكيفية استخدام العبارات try، catch، finally و throw للتعامل مع الأخطاء. كما تعرفنا على كيفية إنشاء استثناءات مخصصة للتعامل مع حالات معينة. نوصي بممارسة التمرين المقدم لاكتساب المزيد من الخبرة. لا تنسَ ترك تعليق أو مشاركة هذا الدرس مع أصدقائك على وسائل التواصل الاجتماعي إذا وجدته مفيدًا!

التعليقات

اترك تعليقاً