Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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

جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 60 من 87.

تغطي الاستثناءات المضمّنة في Java العديد من سيناريوهات الأخطاء الشائعة، ولكنك تحتاج أحيانًا إلى استثناءات خاصة بنطاق تطبيقك. تتيح لك الاستثناءات المخصّصة إنشاء أنواع أخطاء ذات معنى توضّح بجلاء ما الذي حدث بشكل خاطئ.

لإنشاء استثناء custom، ما عليك سوى توسيع فئة استثناء موجودة. بالنسبة إلى استثناء checked، وسّع Exception:

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

بالنسبة إلى استثناء غير مُتحقَّق منه، قم بتوسيع RuntimeException:

public class InvalidAgeException extends RuntimeException {
    public InvalidAgeException(String message) {
        super(message);
    }
}

يمرّر استدعاء super(message) رسالة الخطأ إلى الصنف الأب، مما يجعلها متاحة من خلال getMessage(). يمكنك بعد ذلك استخدام throw وcatch مع الاستثناء custom الخاص بك مثل أي exception آخر:

public void withdraw(double amount) throws InsufficientFundsException {
    if (amount > balance) {
        throw new InsufficientFundsException("Balance too low: " + balance);
    }
    balance -= amount;
}

// استخدامه
try {
    account.withdraw(1000);
} catch (InsufficientFundsException e) {
    System.out.println(e.getMessage());
}

تجعل الاستثناءات المخصّصة التعليمات البرمجية أكثر قابلية للقراءة، وتسمح للجهات المستدعية بالتعامل مع حالات خطأ محددة بطرق مختلفة. وتكون قيمتها أكبر خصوصًا عند إنشاء واجهات API أو مكتبات، حيث يكون التواصل الواضح بشأن الأخطاء مهمًا.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لحجز التذاكر يستخدم الاستثناءات المخصصة للتعامل مع سيناريوهات الأخطاء المختلفة! ستنشئ أنواع استثناءات ذات معنى توضّح بوضوح ما الذي حدث بشكل خاطئ عند حجز التذاكر.

ستنظّم التعليمات البرمجية عبر أربعة ملفات:

  • TicketSoldOutException.java: أنشئ استثناءً مخصصًا checked (extends Exception) للحالة التي لا تعود فيها التذاكر متاحة. يجب أن يقبل الاستثناء message في constructor الخاص به ويمرّره إلى parent class باستخدام super(message).
  • InvalidSeatException.java: أنشئ استثناءً مخصصًا unchecked (extends RuntimeException) للحالة التي يحاول فيها شخص ما حجز رقم مقعد غير صالح. يجب أن يقبل هذا الاستثناء أيضًا message ويمرّره إلى parent الخاص به.
  • TicketBooth.java: أنشئ class يدير مبيعات التذاكر. يجب أن يتتبّع booth العدد الإجمالي للمقاعد المتاحة وأعلى رقم مقعد صالح. تضمّن:

    constructor يأخذ العدد الإجمالي للمقاعد المتاحة.

    method bookTicket(int seatNumber) يتحقق من صحة الحجز. إذا لم يتبقَّ أي تذاكر (كانت available seats تساوي 0 أو أقل)، اطرح TicketSoldOutException مع message "No tickets remaining". إذا كان رقم المقعد أقل من 1 أو أكبر من إجمالي المقاعد، اطرح InvalidSeatException مع message "Seat [seatNumber] does not exist". Otherwise، قلّل available seats بمقدار 1 واطبع Booked seat [seatNumber] successfully.

    method getAvailableSeats() يعيد العدد الحالي للمقاعد المتاحة.

  • Main.java: اجمع نظام التذاكر الخاص بك! ستتلقى مدخلين: العدد الإجمالي للمقاعد ورقم مقعد لحجزه.

    أنشئ TicketBooth باستخدام إجمالي المقاعد given. ثم attempt إلى حجز رقم المقعد المحدد داخل كتلة try-catch. نظرًا لأن TicketSoldOutException هو checked، يجب أن تتعامل معه. التقط TicketSoldOutException first واطبع Booking failed: [exception message]. ثم التقط InvalidSeatException واطبع التنسيق نفسه: Booking failed: [exception message].

    After كتلة try-catch، اطبع Remaining seats: [count] باستخدام method getter.

ستتلقى مدخلين بالترتيب: إجمالي المقاعد (عدد صحيح) ورقم المقعد المراد حجزه (عدد صحيح).

لاحظ كيف تجبر الاستثناءات checked المستدعين على التعامل معها (باستخدام try-catch أو throws)، بينما لا تتطلب الاستثناءات unchecked معالجة صريحة. اختر نوع الاستثناء بناءً على ما إذا كان الخطأ شيئًا ينبغي للمستدعين توقّعه والتعافي منه!

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int totalSeats = scanner.nextInt();
        int seatNumber = scanner.nextInt();
        
        // TODO: قم بإنشاء TicketBooth بإجمالي المقاعد المعطى
        
        // TODO: استخدم كتلة try-catch لمحاولة حجز المقعد
        // - التقط TicketSoldOutException أولاً واطبع "Booking failed: [exception message]"
        // - التقط InvalidSeatException واطبع "Booking failed: [exception message]"
        
        // TODO: After the try-catch, print "Remaining seats: [count]"
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Java عبر الإنترنت