חריגות מותאמות אישית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 או ספריות שבהם חשוב להעביר מידע ברור על שגיאות.
אתגר
קלבואו נבנה מערכת להזמנת כרטיסים שמשתמשת בחריגות מותאמות אישית כדי לטפל בתרחישי שגיאה שונים! תיצרו סוגי חריגות משמעותיים שמבהירים מה השתבש בעת הזמנת כרטיסים.
תארגנו את הקוד שלכם בארבעה קבצים:
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]"
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית10טיפול בחריגות ב-OOP
היררכיית מחלקות החריגותחריגות מותאמות אישיתשגיאות Checked לעומת Uncheckedתבנית Try With Resourcesחזרה – משתמש מאומת2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין