More Related Content Similar to Java - OOP - Exceptions Handling (7) More from מורן אלקובי (20) Java - OOP - Exceptions Handling2. בחריג טיפולים–Exceptions Handling
,מסוימים ובמקרים סגורים למנגנונים המתכנת בידי אחרות בשפות היו אשר מכניות מטלות המון הפך ג'אווה בשפת תכנות
,המתכנת של המסוכנות מהידיים האחריות את לקחו אשר ,"שחורות ל"קופסאות אףבתכנות להתעסק לו לאפשר במטרה
של הצלחה אי או הצלחה לתיאור קודים של רשימה תחזוקת או זיכרון של ופינוי הקצאה כגון תחזוקתיות בעבודות ולא
.בתכנית המתבצעות פעולות
צלחה או נכשלה המתודה פעולת האם לדעת ע"מ מתודות של חזרה בערכי להשתמש נהוג ,שונות בשפותפעמים והרבה
משכל העובדה או לגיטימיים חזרה ערכי מגוון עקב התקלה לתיאור באופציות מחסור כגון בקשיים נתקלים אלו נגנונים
אחידות חוסר של בעיות גם כך ובשל הצלחה או כישלון שונה באופן להגדיר יכול מתכנתאחד חזרה ערך של משמעות וריבוי
שונים מתכנתים של לחזונם בהתאם.
ש קורה מעט לאתכניתמגיעהבו למצבאת משתפת אשר אינטראקטיבית בתכנית מדובר באם לדוגמה .תקלה קורה
או ,ההזנה לחוקיות בנוגע מפורשות הוראות קיבל שזה ולמרות ערכים להזין האפשרות את לו שמקנה בכך המשתמש
.שגוי קלט ערך הזין המשתמש ואותו קרה ,בטעות או הבנה מחוסר
ט ,כה עדופלוא בעיותלהלמנוע ע"מ ,היעד במקום השגויים הערכים של הצבתם מראש למנוע כדי פרטניות בדיקות ע"י
מראשה אתשגיאה,:לדוגמהשל ביצועבדיקהקלט תלמערך גישה לפנייודעים אנו שמראש כךשלאינדקס נעשית הפניה
שהוגדר המערך מגבולות חורג שאינו חוקיב מההגבלות חורג לא המוזן שהערך ו/אותכנית.
עלינו שיהיה להבין ניתן זו מדוגמה כבראת הכיוונים מכל ""לסגור ע"מ תנאים המון ולייצר מקרים המון לכסותהפרצות כל
האפשריותאפשרית זו וטכניקהאמנםרבות קוד שורות בכתיבת מלווה אך ,,מסוימים במקרים מסיבי קוד בשכפולוכן כמו
.המתכנת מצד מיותרת בעבודה
מנת עללאלו בעיות על התגברבדבר שהוזכרו הבעיות ועל,החזרה ערכימשוכלל מנגנון הומצאיותר הרבה ויעיללטיפול
בחריגים.
חריג של זריקה הממחיש קוד בקטע נתבונןהפני של יוצא כפועלי:מערך מגבולות החורג לאינדקס ה
public class ExceptionExample1 {
public static void main(String[] args) {
int arrayOfInt[] = {0, 1, 2};
for(int index=1; index <= arrayOfInt.length; index++) {
System.out.println(arrayOfInt[index]);
}
}
}
ריצה זמן חריגת תניב זה קוד קטע של הרצהמהסוגArrayIndexOutOfBoundsException:
Exception in thread "main" 1
2
java.lang.ArrayIndexOutOfBoundsException: 3
at ExceptionExample1.main(ExceptionExample1.java:9)
מנגנון אותו ע"י עבורנו סונתזה זו שגיאה הודעת .זו השגיאה הודעת על לדווח בעצמנו דאגנו לא שאנו לב נשיםExceptions
.בשפה "אין "בילד שקיים שהזכרנו
.הסיפור בכל המתכנת של תפקידו על לדבר נעבור ,המערכת צד את משראינו כעת
3. ובמקרים בקוד שנעשית פעולה מכל כתוצאה המערכת ע"י להיזרק שעלולות החריגות לסוגי מודע להיות המתכנת על
מהמערכת לצפות ניתן לא שהרי ,ידיו על שנכתב מהמימוש הנובעות בתקלות לטפל שידעו משלו חריגות סוגי לייצר מסוימים
המתכנת ידי על שנכתבו מימושים עם להתמודד לדעתושאינ.בשפה מובנים ם
הזכרנו'מס כברשל היווצרותו עצם את חופשית בשפה לתאר נועד זה מינוח .חריגה של ""זריקה המושג את פעמים
אובייקטמה אחר או זה באופן שיורשת ממחלקהמחלקהThrowableתקלה או משגיאה כתוצאה ,:
בתוך אוטומטית בצורה להיווצר יכול האובייקט אותושהוא במתודה המתכנת ע"י ידני באופן או ,כתובה מחלקה של מתודה
.בעצמו כתב
,חומרתי פיזי כשל להיות יכולות לשגיאה הסיבות.המתודה בהפעלת שגיאה או חיצוני ממקור קלט שגיאות
ובמ בתכנית להשתמש נוסף ניסיון למשתמש לאפשר ניתן ,כן כמו ,בתקלה ולטפל לנסות ניתן שגיאה של במקרהקיצון צב
.השגיאה על הודעה תוך מסודרת בצורה מהתכנית ולצאת הנתונים את לשמור פשוט ניתן
שצצה בבעיה לטפל ע"מ נוספות פעולות לבצע באפשרותנו שיש להסיק ניתן ,קודם שהצגנו ומהדוגמה הכתוב מןריצת בזמן
התכנית.כה עד ביצענו שלא
למצב תכנית מגיעה בהם רבים מקריםכגון תקלה,שהוצג זה.ריצה זמן חריגת של זריקה ידי על מטופליםלמנוע מנת על
.שנזרקה החריגה את ""לתפוס יש התכנית של קריסה
בצורת נכתב הריצה בזמן שנזרקות בחריגות לטפל ע"מ שנועד המנגנוןבלוקTry-Catch.
בלוקtryלכל .חריגות לזרוק שעלול ככזה מגדירים אנו אותו לקטע כתוחם משמשבלוקtryאו אחד בלוק להצמיד יש שכזה
בלוק מסוג יותרcatch.
בלוק כל להתאים ניתןcatch.חריגות של שונים לסוגים שונה טיפול לאפשר כזה ובאופן חריגה של מסוים סוג שיתפוס כך
4. בלוקי של שילוב תוך הנ"ל הדוגמה של שיפור נראהtryו-catch:מתאימים
public class ExceptionExample2 {
public static void main(String[] args) {
int arrayOfInt[] = {0, 1, 2};
for(int index=1; index <= arrayOfInt.length; index++) {
try {
System.out.println(arrayOfInt[index]);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Index not in range!");
}
}
}
}
הודעת תתקבל לא כבר ,זה קוד קטע בהרצתהחריגההנ"להבא הפלט אלא ,התכנית של מסודר סיום תוך:
1
2
Index not in range!
הכללית התבנית"בלוק נקראתtry-catch"כך ומוגדרת:
try {
//Code that might throw an exception...
}
catch(ExceptionOfType1 eot1) {
//In case of SomeException1 do...
}
catch(ExceptionOfType2 eot2) {
//In case of SomeException2 do...
}//...
ה בלוק-catch.מטפל הוא בו מהסוג ממחלקה שיורשות ממחלקה או מטפל הוא בו מהסוג לחריגה "כניסה "נקודת מאפשר
הבהראשון לוקזה במקרהמ חריגה מקבלטיפוסExceptionOfType1בשםeot1מ חריגה מקבל השני והבלוקטיפוס
ExceptionOfType2בשםeot2.
ה בלוק ע"י תיתפס החריגה-catchבלוק קיים באם תלות מבלי ,בה לטפל שיכול הראשוןcatch.בהמשך יותר מתאים
החריגה אותה אםבלוק שום ע"י נתפסה לאcatchב שימוש נעשה לא כאילו יהיה הטיפול המשך ,-try-catch.
ל יהיה ניתן ,נתפסה אכן והחריגה במקרהש לבעיה הקשורים נתונים ממנה קרואנוצרה בגינה,,בבעיה לטפלאת לזרוק
החריגההלאה.ועוד
:לב שימושל בלוקיםtryוcatch -,אחרים בלוקים כמו)לולאות (כגון.עצמו בפני הגדרה כתחום נחשביםשבמקרה כך
ובתוךבלוקהtry-,משתנה יוגדריוכר לא הואאל.לבלוק מחוץ
זו לבעיה פתרון:ה לבלוק הכניסה לפניtry-ל ,הגדירלבלוק מחוץ גם משמעות להם שיש משתנים
(אובייקטים כלשהו ריק התחלתי ערך להם ולתתיקבלו(null.
5. finally
ה בלוק-finallyשל הרצה המאפשר בלוק הואשיתבצעו פעולותמקרה בכלאוסף ביצוע בסוףשל המותנה הפעולות
ה בלוק-try-catchגם ,תיתפס והיא חריגה תיזרק אם גם ,כלומר ,תיזרק לא אם וגם תיתפס לא והיא חריגה תיזרק אם
.בכלל חריגה
יופעל לא זה בלוק בהם קיצוניים מקרים שקיימים כמובןבבלוק הקוד קטע ביצוע טרם קרו והם בהנחה זאת ,:
מתודת התהליכון באותו והופעלה בתהליכון רץ הבלוקstop().
המתודה הופעלהSystem.exit()פעו להפסקת גורמת אשרה של לתו-JVM.
.עצמו הבלוק בתוך כהלכה טופלה ולא נתפסה שלא חריגה נזרקה
ה בלוק-finallyלהציבו יש ,שומש הוא באם אך ,בו שימוש חובת ואין רשות בלוק הוארשימת סוף אחריבלוקיה-catch.
בו לשימוש דוגמה נראה:
public class ExceptionExample3 {
public static void main(String[] args) {
int arrayOfInt[] = {0, 1, 2};
for(int index=1; index <= arrayOfInt.length; index++) {
try {
System.out.println(arrayOfInt[index]);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Index not in range!");
}
finally {
System.out.println("This will print anyway!");
}
}
}
}
נציין:קטע יתבצע ,נתפסה והחריגה במידה .החריגה נזרקה בה בשורה פעולתה את תפסיק התכנית ,חריגה נזרקה באם
ה בלוק שבתוך הקוד-finallyה לבלוק תחזור ולא שאחריו הקוד משורת פעולתה את תמשיך והתכנית-try!
ה בלוק שבתוך הקוד קטע יתבצע ,נתפסה לא והחריגה במידה-finally.פעולתה את תפסיק והתכנית
בפקודה שימוש נעשה בו מצב היא לציון מעניינת נקודהreturnבלוק של גוף בתוךcatch.
של להפסקה תגרום זו פקודהבלוק יופעל זה במקרה גם ,לב לשים יש אך ,שהוחזר הערך עם וליציאה המתודה פעולת
ה-finally!מהמתודה היציאה לאחר תתבצע שפעולתו הוא שמעניין ומהבהם מקרים על לחשוב כמובן מתבקש (כאן
מטיפוס נניח מסוים ערך שמחזירה מתודהIntegerאוBooleanהזה הערך מהמתודה היציאה ולאחרמשתנהבבלוקהסיום)
ב שימוש ייעשה בהם במקרים גם-break, continueאוthrowבלוק ירוץ ,ה-finally.הסיום טרם
6. ,כן אםל ניתןכתובכללית תבניתכך ,במנגנון לשימוש יותר:
try {
//Code that might throw an exception...
}
catch(ExceptionOfType1 eot1) {
//In case of ExceptionOfType1 do...
}
catch(ExceptionOfType2 eot2) {
//In case of ExceptionOfType2 do...
}…
finally {
//Do this part anyway!
}
throw
בח עסקנו ,כה עדמובנות שיטות ידי על שנזרקו ריגותבשפה..אחרים מפתחים ע"י שנזרקו חריגות ""לתפוס למדנו ,כלומר
ולה משלו חריגות ליצור המתכנת באפשרות יש ,כאמוריעזרבהןבתוכניתשימוש תוך ,החריגו במנגנוןתהשפה של.
הפקודה בעזרת מתבצעת חריגה של זריקהthrowבאופןהבא:
throw new MyException();
ממשפט כחלק תבוצע היא ולרוב:הבא באופן לדוגמה תנאי
if (!myObject.exists()) {
throw new SQLException("Not Exist in DB!");
}
החריגותה לזרוק שניתןןמ אובייקטיםהמובנית המחלקה את שמרחיבה מחלקה כלExceptionה ,ה ספריותמובנות
בגרבים חריגות סוגי מכילות 'אווהב כבר נתקלנו ,-NullPointerException, ArrayIndexOutOfBoundsException
ו,צויין שכבר כמוליצו ניתןרחדשים סוגים גםאישית ומותאמים.חריגות של
יכלול ,לרובשםהמחלקההמילה את בסופוException,לא זהחובהא ,ךזה במנהג לדבוק רצויהזיהוי וקלות הבהירות לשם
שלש מחלקותמתארותחריגות.
ב לשימוש נוספות דוגמאות-throw:
throw new Exception();
throw new RunTimeException("Illegal Input");
7. מתי?
שימוש ,כללי באופןבחריגותלמצבים שמורבהםהתנהגותהתוכניתאינהשל היסוד הנחת שבו ברגע ,כלומר ,ברורה
.כשקרית מתבררת מסוים קוד קטע אמיתות
הדוגמאותפנייה :שראינולאיברלאחוקיבמערך,אושמכיל במשתנה שימושNULL,במנגנון לשימוש טובות דוגמאות אינן ,
ועל המתכנת של בשליטתו שאינן מתקלות או לקויה קוד מכתיבת שנובעות שגיאות הן זה מסוג שגיאות .ריצה שגיאות אלו
.המנגנון ברמת ולא הקוד ברמת להיות צריך בהן הטיפול ,כןהיות בלבד ההמחשה לשם נעשה המנגנון ברמת בהן הטיפול
.ורעיונית ויזואלית מבחינה בהן להתבונן שנוח דוגמאות ואלו
התכנית התנהגות האם עצמנו את נשאל ,לא ומתי בחריגות בשימוש צורך יש למתי בנוגע האבחנה את לעשות מנת על
המת מקרים שני נציג ?לא או מסוים קוד קטע עבור ברורה:לשאלה אחרת תשובה אחד כל ,ברור באופן ארים
ממחלקה יורשת המחלקה אותה האם תשובה להחזיר ותפקידה שרירותית מחלקה איזושהי שמקבלת מתודה ונתונה נניח
אותה המחלקה אם גם בעיה תהיה לא ,כלומר ,שלילית או חיובית תשובה להחזיר יכולה זו מתודה ."מ"רשימה נניח ,אחרת
ת בוחנת היא!ברורה המתודה התנהגות בו למצב דוגמה זוהי .ערך להחזיר תדע תמיד המתודה ...לא אם וגם רשימה היה
.אורכה את ומחזירה רשימה מקבלת אשר ,נוספת מתודה ומתונה נניח ,זאת לעומתמה השאלה נשאלת המתודה בגוף
למתו שסופק שמה ההנחה על נשענת זו שאלה אך ,למתודה שסופקה הרשימה אורך,כאן ולכן ...רשימה אכן זו דה
.חריגה תיזרק שכאלו במקרים ?רשימה סופקה לא אם מה .ברורה אינה התכנית התנהגות
מהווה בחריגות שימושיתרון,זה כלי ובעזרת היות מהותישל ביכולתו ישהמתכנתלקבועבעצמוהתנהגות אופי את
לבח יוכל המתכנת .בעיה של מקרים אותם בכל שכתב התכניתתציג שהתכנית ורהודעתשגיאהמתאימה,שהתכנית
,מהשגיאה תתעלםשהתכניתתקרוסאף ולרובניסיון יתבצעלפתוראתהבעיהבזמן בו.
החיסרוןבחריגות שימוש של.אחרים מובנים אוטומטיים במנגנונים שימוש מכל שנובע מהחיסרון שונה אינו
שף להעסיק מבקש אדם בו למצב זאת להקביל ניתןהייתה האיש של העיקרית מטרתו .דרישה לפי ארוחות לו שיכין פרטי
מראש התראה נדרשה ,כן כמו ,מהרגיל גבוה היה כמובן המחיר ,בעצמו האוכל את להכין צורך מבלי מוכנות ארוחות לקבל
ה"אובר זהו .חשבונות בהנהלת וטיפול טלפון בשיחת שלוותה-.מוכנה שף בארוחת הרצון עקב שנוצר "הד
ה"אובר-שנוצר "הדהחריגות במנגנון בשימושעלות הואזיכרוןוב פגיעהיעילותזמןהריצהה עקבש עובדהחריגותבעצם הן
.אינסטנסיאציה תהליך של תוצר בעצם היא שנזרקת חריגה כל ולכן אובייקטים,כן כמושימושבחריגותמכריחאותנולהוסיף
בלוקיםשלtryושלcatch,והתוצאההיאקודארוךיותרוקריפחות א.
,למשל חביתה כגון פשוטה ארוחה לאכול האדם ירצה בהם שבמקרים כמסקנה לציין נוכל ,השף ארוחות לדוגמת נחזור אם
ולטגן הביצה את לשבור ,למטבח ללכת לו יהיה עדיף,בדיוק האופן ובאותוה את נשמורשימושבחריגותולא הצורך למקרה
זה במנגנון שימוש נעשההצדקה ללא....פשוט תנאי משפט באמצעות הבעיה את לפתור פשוט ניתן מקרים בהרבה
8. :בחריגות לשימוש דוגמה נראה
import java.util.Scanner;
public class ExceptionExample4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = 0;
boolean isInteger = false;
do {
System.out.println("Enter patient age (without floating point): ");
String input = scanner.next();
try {
age = Integer.parseInt(input);
isInteger = true;
}
catch(NumberFormatException e) { //Exception thrown when the input isn't an int
isInteger = false;
}
} while(age < 0 || age > 120 || !isInteger);
System.out.println("Patient's age: "+age);
}
}
בדוגמהExceptionExample4שימוש נעשהבחריגותה שזורקתמתודהparseIntיזין שהמשתמש לכך לדאוג ע"מאת
(כ המטופל גילשלם מספר)אחר משהו ולא.,כך לשםהקלט תקינות לגבי ,כן וכמו )(טווח הקלט אמיתות לגבי בדיקות נעשות
(פורמט.)
9. throws
Checked exceptions
מתודה בהם מצבים קיימיםבתוך נתפסת שלא חריגה זורקת שכתבנוהגדרתה תחום.במ,אלו צביםלהבין עלינו יש
יותר גבוה במקום לטיפול ,המתודה לגבולות מחוץ אל נזרקת שהחריגהאו ,הופעלה האמורה המתודה שממנה במתודה ,
אחרת במתודה.מבחוץ ולטפל לתפוס שמחכה מי שיש בתקווהו במידהאחד באף נתפסה לא החריגהה אז ,מהשלבים-
default handlerשלJavaהשגיאה הודעת עם מסתיימת פשוט התכנית בהם המקרים (אלו בה יטפל–.)""קורסת
,מהמתודה הלאה נזרקת החריגה בהם מצבים באותםב במפורש זאת לציין חייביםבאמצעות המתודה של ההצהרה שורת
השמורה המילהthrows.
המתודה את לדוגמה נציגmethodNameאשרמטיפוס חריגה זורקתSomeException.ההמתודה צהרתכך תיראה:
private void methodName() throws SomeException { }
דומה באופןמ חריגות לזרוק מתודה יכולה ,:אחד מטיפוס יותר
private void methodName() throws IOException, SQLException { }
הוספת של המשמעותלה זו הצהרהכרז,מתודה תש היאכל ,הוספה שהיא מרגעש מיבמתודה ישתמשלתפיסה לדאוג חייב
אות החריגות שלןזורקת היאבלוק באמצעות או ,try-catchאוהכרזת של הוספה באמצעותthrowsה באותהמתודה
" היא כך של שהמשמעותזריקה"הלאה חריגה אותה של.
Unchecked exceptions
יוצאותמןהכללהןחריגותמהטיפוסErrorומהטיפוסRunTimeExceptionוכלהיורשיםמהאשר ,ןאינםדורשיםהכרזה
השמורה המילה באמצעותthrows.
חריגותמטיפוסErrorהןחריגותשנזרקותב לשיבוש שגרמה חיצונית טכנית תקלה של קיומה בעתפעילותהתוכניתלעתים ,
ב בעיה-JVMזה מסוג תקלות על להצהיר צורך אין ולכן בהם לשלוט יכולים שאנו דברים לא ולרוב 'וכד–שלנו בידיים לא זה.
חריגותמטיפוסRunTimeErrorפשוטות ובמילים התכנית של בלוגיקה מבעיה לרוב נובעות–חובה אין ,ולכן לקוי מתכנות
הצהרה עלעשהמתכ היא ההנחה .זה מסוג חריגות בורשעלולות מתודות :לדוגמה .כראוי לתכנת ידאג נתלזרוק
NullPointerExceptionקובץ מהרשת שמקבלת מתודה או ,XML...מתאים לא כבר ולכן השתנה הפורמט אך ,
ניתןלכתובחריגותשמרחיבותאתהמחלקהRunTimeExceptionובכךלהימנעמהצורךלהכריזעלחריגהמאותוטיפוס.
,כן אם מדועאת 'וכד תנאי משפטי באמצעות לבדוק היא האלטרנטיבה ,ובכן ?זה מסוג בחריגות זאת בכל להשתמש שנרצה
, פשוט ,יעיל יותר מה שיקול לעשות יש כזה במצב ,ובכן ,בהם להשתמש מכן לאחר ורק בעיה להוות שעלולים האלמנטים
.לביצוע וקל קריא
javadoc
תיעודjavadocמתודה שלחריגו שזורקתתהתגית את שיכיל רצוי ,@throwsי ובכךעל דווחהש חריגההמתודה זורקתועל
הקודמת לדוגמה נחזור אם .)חריגה לכל (אלמנט לכך הסיבהה הערת ,-javadocכדלהלן תיראה המתאימה:
/**
* @throws IOException if the file could not be read
* @throws SQLException for any database related problem
*/
private void methodName() throws IOException, SQLException { }
10. היררכיהשלחריגות
ה בתרשים שראינו כפי-UMLהמחלקות היררכיית את המתאר,חריגות שמתארותכלהחריגותהרגילותיורשותמהמחלקה
ExceptionאוממחלקותשיורשותמהמחלקהException.
שימושבירושהההורשה סולם של והיכרות הבנה ,המתארות המחלקות שלחריגותמאפשרלנוגמישותרבהמאתנו וחוסך
:אבסטרקטי פחות קצת ובאופן שלנו ההצהרות את אבסולוטי באופן לממש הצורך את
על ההצהרה בראש להכריז ניתןמתודהכי ,היאזורקתחריגהממסוים טיפוס,ובפועלשל זריקה לבצע ,המתודה בגוף
חריגהמטיפוסאחר,שיורשמהטיפוסעליוהוכרזהמתודה בהצהרת.
,כן כמובתוךבלוקtry-catch,בלוקcatchמ חריגות לתפוס שמיועדטיפוסמסוים,לת יכולפוסגםחריגותמטיפוסים
שיורשים.מסוים טיפוס מאותו
טובה בצורה הנושא את להבין מנת עלהבאה בדוגמה נתבונן ,יותר-נניחשכתבנומחשב משחק המהווה תכנית,ובמהלך
הפרויקטהשתמשנוב:הבאים החריגות סוגי
public class GameServerException extends Exception {}
public class GameProtocolException extends GameServerException {}
public class PlayerException extends GameServerException {}
שקיימת נציין ,כן כמו:המתודה
public void doSomething() throws GameServerException {
}
מטיפוס חריגות לזרוק יכולה זו מתודה כי ומוצהר היותGameServerException,באפשרותה ישחריגות לזרוק גם
מטיפוס:הירושה בסולם ממנה נמוך שנמצאת מחלקהGameProtocolException,PlayerException.
ל ,זאת לעומתבלוקה-tryקריאה תהיה שבתוכולמתודה,בלוק להצמיד חייבים נהיהcatchמסוגל אשרלתפוסחריגות
מהטיפוסGameServerExceptionאומטיפוסהירושה בסולם ממנה גבוה שנמצאת מחלקהוזה במקרההמחלקה
Exception(מטיפוס חריגות גם הבלוק בתוך לתפוס ניתן ,הצורך במידתProtocolExceptionאוClientException.)
חריגות זריקת על שמצהירות מתודות של דריסה
מתודה של דריסה ונבצע במקרהכ,זולזרוק תוכל הדורסת שהמתודה החריגות יהיו גם אלו.
המתודההלא דורסתדרסה היא אותה ,המקורית שהמתודה החריגות את לזרוק חייבת,.זרקה
שזרקה חריגות של הטיפוסים מאותם להיות יכולות אלו חריגות ,הדורסת במתודה חריגות לזרוק מתבקש ואכן במקרה
.המקורית המתודה שזרקה טיפוסים מאותם שיורשים מטיפוסים או ,המקורית המתודה
באופ יכולה דורסת מתודהיותר לזרוק יכולה איננה היא אך ,דרסה היא אותה מהמתודה חריגות פחות לזרוק לגיטימי ן
.ממנה
המתודה את נדרוס אם ,שלנו בדוגמהdoSomething():הבאות החריגות את לזרוק תוכל הדורסת המתודה ,
GameServerException,)זרקה המקורית שהמתודה החריגה וזו (היותGameProtocolExceptionו-
PlayerExceptionואלו (היותחריגותשיורש.)זרקה המקורית שהמתודה מהחריגה ות
11. ב המחלקות כתיבת לסדר חשיבות יש ,כאמורבלוקtry-catchהטיפוסים שסדר כך יוגדר הוא ,כראוי יעבוד שזה מנת ועל
ה בבלוקי הממוקמים-catchהיררכיית את הפוך באופן מתאר:דוגמה נראה .)למעלה (מלמטה הירושה
try {
doSomething();
}
catch(GameProtocolException e) { }
catch(GameServerException e) { }
catch(Exception e) { }
ו היותה לבלוקי הפנייהcatch-ה פי על נעשיתCode Flow-פי על ,כלומר ,סדרעל מלשמור נמנע אם ,הכתיבהסדרהיררכי
של המיקום מבחינת הפוךבלוקיבלוקי בו למצב נגיע ,אלו םcatchוהטיפו משמעות חסרי הופכיםלבא לא בתוכם הנעשה
חסר והופך שימוש לידימשמעות,הבאה בצורה למשל:
try {
doSomething();
}
catch(GameServerException e) { }
catch(GameProtocolException e) { }
היותו-GameProtocolExceptionמ יורשת-GameServerException,אםתיזרקחריגהמטיפוסGameProtocolException,
היאתיתפסבבלוקהראשון(זהשלGameServerException),משוםכך,הבלוקשלGameProtocolExceptionכלללאיהיה
נגיש.
,כן אםמתודה של באפשרותהלזרוקחריגהמכלטיפוסעליוהיאהכריזה(...throws)מ חריגות לזרוק ,כן וכמוטיפוסים
שיורשיםמה אותוטיפוסעליוהיאהכריזה.אםמתודההכריזהעלזריקהשלחריגה,בבלוקה-try-catchאת שמפעיל
החריגה אותה ,המתודהחייבתלהיתפסבלוק ע"יcatchמתאים–שמקבל כזהחריגהמטיפוסזהאומטיפוסשנמצאגבוה
יותרבסולםהירושהבלוק קיים שלא היא המשמעות ,אחרת ,catchבחריגה לטפל שמתאים.
נ כי ,לב נשיםיתןלתפוסבבלוקtry-catchחריגותשנמצאותבמקומותשוניםבאותוסולםירושהשכל מנת על ,זאת עם ,
בלוקיה-catchעבור בלוקים ראשית למקם לדאוג יש ,נגישים יהיוהמחלקותשנמצאותבמקוםנמוךיותרבסולםהירושה
מ בלוקים מכן לאחר ורקתאימיםעבורהחריגותשנמצאותגבוהמהםהוא שיקרה מה ,הפוך יהיה המקרה אם שהרי ,
שה בבלוק לה הייעודי הטיפול את לקבל תגיע לא אך ,)הורשה (מבחינת המתאים הראשון בבלוק תיתפס החריגהממוקם
יותר נמוךובשלתתקמפל לא התוכנית כך.
בלוקי 'למס שונות בחריגות הטיפול את להפריד ניתן כיצד ראינו הנ"ל בדוגמהcatchזה אך ,הירושה להיררכיית בהתאם
במשפט לתפוס תהיה הכללית שההמלצה לציין המקוםcatchאותו את לכולן לתת ,אפשר ובאם חריגות של קבוצה אחד
הטיפול-.בקוד לחסוך נוכל כזה באופן
מטיפוס חריגה של תפיסה הוא שימושית תהיה כזו טכניקה בו למקרה דוגמהIOExceptionלחריגות בסיס מהווה אשר ,
:הבא באופן נתונים של קלט/פלט תקלות כולן ומתארות ממנה שיורשות רבות
catch(IOException e) {
}
משפטcatch.ממנו שירשו הטיפוסים אותם ומכל הטיפוס מאותו חריגות יתפוס בעצם כזה
12. טיפול לתת נרצה ,לעתיםמסוי לחריגה חלקימלא טיפול לבצע שלנו האחריות בתחום לא שזה מכיוון נובע לרוב זה רצון .מת
.בבעיהאותה ולזרוק מעוניינים שאנו הנתונים את לה להוסיף או ממנה לקחת ,חריגה לתפוס ביכולתנו יש ,שכאלו במקרים
בהנחה .טיפול להמשך יותר גבוה במקום תיתפס שהיא בכדי שובבלוק וקייםcatch,החריגה אותה עבורבאותה לטפל ניתן
ב טיפול להמשך אותה ולהעביר הראשוני הטיפול את החריגה)למשל אחרת (מתודה ההיררכיה מעלה:כך ,
catch(PrinterIOException e) {
System.out.println("Printer I/O errors gets this message!");
throw e;
}
catch(PrinterException e) {
System.out.println("Other printer errors gets this message!");
}
מטיפוס חריגה ונזרקה ובהנחהPrinterIOExceptionלמסך יודפס ,(שוב תיזרק והחריגה):
Printer I/O errors gets this message!
כה עד הנאמר את ויזואלית המתאר בתרשים נביטנראה הנתונה המחלקות להיררכיית ובהתאםלהמחשה דוגמאות:
מטיפוס חריגה ונזרקה בהנחהrrorE:
לתפוס יוכל זו חריגהבלוקcatchמטיפוס חריגות שתופסError
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסThrowable
מטיפוס חריגה ונזרקה בהנחהMyFirstException:
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסMyFirstException
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסException
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסThrowable
מטיפוס חריגה ונזרקה בהנחהMySecondException:
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסMySecondException
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסMyFirstException
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסException
בלוק לתפוס יוכל זו חריגהcatchמטיפוס חריגות שתופסThrowable
13. חדש מטיפוס חריגות
מחלקות לכתוב המתכנת באפשרות .תקלה של סוג כל לתאר מנת על במערכת המובנות בחריגות להסתפק נוכל תמיד לא
.חריגות המהוות חדשותמחלקות של כתיבהה זה מסוג:מאוד פשוטה יאליצור מעוניינים אנו האם להחליט עלינו ראשית
מסוג חריגהChecked Exceptionמסוג חריגה אוUnchecked Exceptionליצור שברצוננו במקרה .Checked Exception,
מהמחלקה שיורשת מחלקה ליצור עלינוExceptionליצור שברצוננו ובמקרהUnchecked Exceptionמחלקה ליצור עלינו ,
מ שיורשת-RuntimeException.
במחלקהExceptionקיימותארבעבונות מתודות(קונסטרקטורים)אותןלדרוס ניתןבמידהונרצהשמתנהג כאלו לקבלות
שונה באופןמהמקור.
הבאה בדוגמה נתבונן ,יותר טובה בצורה הנושא את להבין מנת על:
public class MyFirstException extends Exception {
/**
* Serial Number
*/
private static final long serialVersionUID = -7000000000000000000L;
/**
* Constructor with no parameters
*/
public MyFirstException() {}
/**
* @param arg0 Error message
*/
public MyFirstException(String arg0) {
super(arg0);
}
/**
* @param arg0 Nested exception
*/
public MyFirstException(Throwable arg0) {
super(arg0);
}
/**
* @param arg0 Error message
* @param arg1 Nested exception
*/
public MyFirstException(String arg0, Throwable arg1) {
super(arg0, arg1);
}
}
מחלקהזולאמוסיפהדברלמחלקהExceptionנ אך ,הנוכחית בתצורתהוכלבין להבחין ע"מ בה להשתמשסוגיהחריגות
שייזרקו.,כן כמוניתןליצורמחלקותשזו ממחלקה יורשותבמטרהלהבחיןביןמ תקלותסוגיםשונים.
במידהונרצהלהוסיףאפשרויותשונותלמחלקהנוכל ,גםלשנותאתה.שלה הבונות מתודות
14. נניח,לדוגמה,שלהוסיף נוכל ,זה במקרה .חריג כמקרה חריגה של זריקה אי לתאר ברצוננואתהמילים"No Exception:"
לפניתיאורשלכלחריגהשנזרקתשלנו מהמחלקה.
במקרהזה,המתודה את נוסיף:
private static String printNoException(String message) {
return "No Exception: "+message;
}
ונבצעהבאים השינויים אתבמתודות:
public MySecondException(String message) {
super(printNoException(message));
}
public MySecondException(String message, Throwable cause) {
super(printNoException(message), cause);
}
:הבאה המחלקה הגדרת שתתקבל כך
public class MySecondException extends MyFirstException {
/**
* Serial Number
*/
private static final long serialVersionUID = -8000000000000000000L;
/**
* @param arg0 Error message
*/
public MySecondException(String message) {
super(printNoException(message));
}
/**
* @param arg0 Error message
* @param arg1 Nested exception
*/
public MySecondException(String message, Throwable cause) {
super(printNoException(message), cause);
}
/**
* @param message
*/
private static String printNoException(String message) {
return "No Exception: "+message;
}
}
:שיצרנו בחריגה נשתמש ,כעת
15. public class ExceptionExample5 {
public static void main(String[] args) {
int arrayOfInt[] = {0, 1, 2};
for(int index=1; index <= arrayOfInt.length; index++) {
try {
System.out.println(arrayOfInt[index]);
throw new MySecondException("No array index out of bounds
exception thrown yet!");
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("nIndex not in range!");
}
catch (MySecondException e) {
System.out.println("Second Exception Thrown:");
System.out.println(e.getClass());
System.out.println(e.getMessage());
}
finally {
System.out.println("This will print anyway!");
}
}
}
}
:הפלט שיתקבל כך
1
Second Exception Thrown:
class MySecondException
No Exception: No array index out of bounds exception thrown yet!
This will print anyway!
2
Second Exception Thrown:
class MySecondException
No Exception: No array index out of bounds exception thrown yet!
This will print anyway!
Index not in range!
This will print anyway!
16. לתת ברצוני ,"מדי "יבשה הייתה הקודמת שהדוגמה למקרה)קודם בקצרה (הוזכרה נוספת דוגמה–
סכי זוהיבלבד הקונספט הבנת למטרת המיועדת ,רעיונית כללית מה:
מתודה וכתבנו נניחretrieve()קובץ שמקבלתXML.נתונים ממנו ושואבת ברשת ממקור
,כן כמונניחשה קובץ פורמט-XMLהשתנה מהשרת שמגיעהמפתחים ע"יבסדר עבר הכול ,לכאורה .–הורדת ,ההתחברות
מסוים נתון לשלוף נצפה כאשר זאת נגלה אנו .שונה פורמט בעל ,כאמור ,שירד הקובץ אך ...'וכו בדיסק המקום ,הקובץ
לא כבר שאולי...אחר משתנה שם תחת שקיים או ,קיים
פורמטים בין שוני על להתריע שמטרתה ,חדשה חריגה לבנות נוכל שכאלו מקרים עבורק שלובץXMLלקובץ המצופהXML
נתון.
המתודה בתוךretrieve():הבא באופן החריגה את לזרוק נוכל
if (!myObject.match(newObject)) {
throw new XMLFormatException("XML files format doesn't match!");
}
ריצה בשגיאת ומדובר היותשכזו בחריגה לטפל שנרצה להיות מאוד יכול ,זאת עם אך ,החריגה אותה על הכרזה חובת אין ,
ה לקבלת בקשה ע"י ,(למשל-XML,ולכן )הקיים לפורמט החדש הפורמט של המרה ביצוע או ,אחר ממקורנוכלאת להציב
:כך למתודה הקריאה
try {
retrieve();
}
:הבא באופן ,זה מסוג חריגות שיתפוס בלוק להציב ואחריו
catch (XMLFormatException e) {
fix(newObject);
}
סיכום
הר בכל כמואחרת מחלקה של חבה-לה ניתןעמיסבונות מתודותולהוסיףומשתנים מתודותנוספים.
,חריגה המתארת מחלקה בבנייתלבצע לה לתת ולא בלבד המחלקה לפעולת שרלוונטיות פעולות ביצוע על לשמור רצוי
.בתכנית אחרות מחלקות ע"י לביצוע שמתאימות פעולות
חריג שמתארת שמחלקה נרצה לא :לדוגמהתשגיאהברק אלא ,מחדש חיבור ליצור ותנסה בבעיה תטפל ,לרשת חיבור
על שתודיע.מסודר לוג בקובץ אותה ותתעד התקלה
נצייןאצבע כללבחריגה הטיפול את :בנושאישאות שיתפוס מי בידי תמיד להשאירה.
.מקרה בכל אותה ולתפוס לנסות צורך אין אז ,להתאושש דרך אין ממנה בחריגה מדובר אם :נוסף אצבע כלל