Menu
Coddy logo textTech

חריגות מותאמות אישית

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 60 מתוך 87.

החריגות המובנות של Java מכסות תרחישי שגיאה נפוצים רבים, אבל לפעמים יש צורך בחריגות ספציפיות לתחום של היישום שלך. חריגות מותאמות אישית מאפשרות לך ליצור סוגי שגיאות משמעותיים שמבהירים מה השתבש.

כדי ליצור חריגה מותאמת אישית, פשוט הרחב מחלקת חריגות קיימת. עבור חריגה מסומנת, הרחב את 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(). לאחר מכן אפשר לזרוק ולתפוס את החריגה המותאמת אישית שלך כמו כל חריגה אחרת:

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: צרו חריגה בדוקה מותאמת אישית (שיורשת מ-Exception) למקרה שבו הכרטיסים אינם זמינים עוד. החריגה שלכם צריכה לקבל הודעה בבנאי שלה ולהעביר אותה למחלקת האב באמצעות super(message).
  • InvalidSeatException.java: צרו חריגה לא-בדוקה מותאמת אישית (שיורשת מ-RuntimeException) למקרה שמישהו מנסה להזמין מושב שמספרו אינו תקין. החריגה הזאת צריכה גם לקבל הודעה ולהעביר אותה למחלקת האב.
  • TicketBooth.java: צרו מחלקה שמנהלת מכירת כרטיסים. על הדוכן לעקוב אחר מספר המושבים הזמינים הכולל ואחר מספר המושב התקין הגבוה ביותר. כללו:

    בנאי שמקבל את מספר המושבים הזמינים הכולל.

    מתודה bookTicket(int seatNumber) שמוודאת את תקינות ההזמנה. אם לא נותרו כרטיסים (מספר המושבים הזמינים הוא 0 או פחות), זרקו TicketSoldOutException עם ההודעה "No tickets remaining". אם מספר המושב קטן מ-1 או גדול ממספר המושבים הכולל, זרקו InvalidSeatException עם ההודעה "Seat [seatNumber] does not exist". אחרת, הפחיתו את מספר המושבים הזמינים ב-1 והדפיסו Booked seat [seatNumber] successfully.

    מתודה getAvailableSeats() שמחזירה את מספר המושבים הזמינים הנוכחי.

  • Main.java: חברו יחד את מערכת הכרטיסים שלכם! תקבלו שני קלטים: מספר המושבים הכולל ומספר המושב להזמנה.

    צרו TicketBooth עם מספר המושבים הכולל הנתון. לאחר מכן, נסו להזמין את המושב שצוין בתוך בלוק try-catch. מכיוון ש-TicketSoldOutException היא חריגה בדוקה, עליכם לטפל בה. תפסו תחילה את TicketSoldOutException והדפיסו Booking failed: [exception message]. לאחר מכן תפסו את InvalidSeatException והדפיסו באותו הפורמט: Booking failed: [exception message].

    לאחר בלוק ה-try-catch, הדפיסו Remaining seats: [count] באמצעות מתודת ה-getter.

תקבלו שני קלטים לפי הסדר: מספר המושבים הכולל (מספר שלם) ומספר המושב להזמנה (מספר שלם).

שימו לב כיצד חריגות בדוקות מחייבות את הקוד הקורא לטפל בהן (באמצעות try-catch או throws), בעוד שחריגות לא-בדוקות אינן דורשות טיפול מפורש. בחרו את סוג החריגה בהתאם לשאלה אם מדובר בשגיאה שהקוד הקורא אמור לצפות לה ולהתאושש ממנה!

נסו בעצמכם

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: לאחר הבלוק try-catch, הדפיסו "Remaining seats: [count]"
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין