שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2016 - חריגות
שאלה 3 (20 נקודות)
סעיף א (10 מתוך 20 נקודות): מה יהיה פלט התחנוניות של התיקניות בתוכנה:
סעיף ב (10 מתוך 20 נקודות): מה תהיה החתונוניות אם תשנו את 4 השורות הראשונות של התיקניות בתוכנה לתיקניות בתוכנה:
סעיף א (10 מתוך 20 נקודות): מה יהיה פלט התחנוניות של התיקניות בתוכנה:
סעיף ב (10 מתוך 20 נקודות): מה תהיה החתונוניות אם תשנו את 4 השורות הראשונות של התיקניות בתוכנה לתיקניות בתוכנה:
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2016סמסטר ב
★★★★★
חריגותירושהפולימורפיזםמעקב אחר קוד
עקבו אחר זרימת החריגה דרך מתודות מקוננות. שימו לב כיצד היררכיית הירושה של החריגות קובעת איזה בלוק
catch יתפוס את החריגה, וזכרו שבלוק finally מתבצע תמיד.### סעיף א
היררכיית החריגות:
-
-
-
-
לכן,
מעקב אחר ריצת התוכנית:
1. הביצוע מתחיל בפונקציה
2.
3. בתוך
4. לפני שהחריגה מתפשטת במעלה המחסנית, בלוק ה-`finally` של
- יודפס:
5. החריגה מסוג
6. הבלוק הראשון הוא
- יודפס:
7. בתוך בלוק ה-
8. לפני שהחריגה החדשה (
- יודפס:
9. החריגה מסוג
10. הבלוק הראשון הוא
11. בתוך הבלוק, הפקודה
- יודפס:
12. לאחר סיום בלוק ה-
- יודפס:
13. התוכנית מסיימת.
הפלט הסופי לסעיף א:
f2-finally
f1-catch-E3
f1-finally
E4
main-finally
### סעיף ב
היררכיית החריגות החדשה:
-
-
-
-
כעת,
מעקב אחר ריצת התוכנית:
1. השלבים 1-3 זהים:
2. בלוק ה-`finally` של
- יודפס:
3. החריגה מסוג
4. הבלוק הראשון הוא
5. הבלוק השני הוא
6. מכיוון שהחריגה לא נתפסה ב-
- יודפס:
7. החריגה מסוג
8. הבלוק הראשון הוא
9. הבלוק השני הוא
- יודפס:
10. לאחר סיום בלוק ה-
- יודפס:
11. התוכנית מסיימת.
הפלט הסופי לסעיף ב:
f2-finally
f1-finally
EXCEPTION
main-finally
היררכיית החריגות:
-
E2 יורשת מ-E3-
E3 יורשת מ-E1-
E4 יורשת מ-E1-
E1 יורשת מ-Exceptionלכן,
E2 היא גם מופע של E3 וגם של E1. E4 היא גם מופע של E1.מעקב אחר ריצת התוכנית:
1. הביצוע מתחיל בפונקציה
main, אשר קוראת ל-f1().2.
f1() קוראת ל-f2().3. בתוך
f2(), נזרקת חריגה חדשה מסוג E2.4. לפני שהחריגה מתפשטת במעלה המחסנית, בלוק ה-`finally` של
f2() מתבצע.- יודפס:
f2-finally5. החריגה מסוג
E2 מתפשטת אל f1(). המערכת מחפשת בלוק catch מתאים.6. הבלוק הראשון הוא
catch (E3 e). מכיוון ש-E2 היא מחלקת בת של E3, החריגה נתפסת כאן (עיקרון הפולימורפיזם).- יודפס:
f1-catch-E37. בתוך בלוק ה-
catch, נזרקת חריגה חדשה מסוג E4. החריגה המקורית (E2) נמחקת.8. לפני שהחריגה החדשה (
E4) מתפשטת, בלוק ה-`finally` של f1() מתבצע.- יודפס:
f1-finally9. החריגה מסוג
E4 מתפשטת אל main(). המערכת מחפשת בלוק catch מתאים.10. הבלוק הראשון הוא
catch (E1 e). מכיוון ש-E4 היא מחלקת בת של E1, החריגה נתפסת כאן.11. בתוך הבלוק, הפקודה
e.getClass().getSimpleName() מדפיסה את שם המחלקה של האובייקט *האמיתי* שנתפס, שהוא E4.- יודפס:
E412. לאחר סיום בלוק ה-
catch, בלוק ה-`finally` של main() מתבצע.- יודפס:
main-finally13. התוכנית מסיימת.
הפלט הסופי לסעיף א:
f2-finally
f1-catch-E3
f1-finally
E4
main-finally
### סעיף ב
היררכיית החריגות החדשה:
-
E1 יורשת מ-E2-
E2 יורשת מ-Exception-
E3 יורשת מ-Exception-
E4 יורשת מ-Exceptionכעת,
E2, E3, ו-E4 הן מחלקות "אחיות" שאין ביניהן קשר ירושה, ו-E1 היא תת-מחלקה של E2.מעקב אחר ריצת התוכנית:
1. השלבים 1-3 זהים:
main קוראת ל-f1, שקוראת ל-f2, וב-f2 נזרקת חריגה מסוג E2.2. בלוק ה-`finally` של
f2() מתבצע.- יודפס:
f2-finally3. החריגה מסוג
E2 מתפשטת אל f1(). המערכת מחפשת בלוק catch מתאים.4. הבלוק הראשון הוא
catch (E3 e). E2 אינה תת-מחלקה של E3, לכן החריגה לא נתפסת.5. הבלוק השני הוא
catch (E4 e). E2 אינה תת-מחלקה של E4, לכן החריגה לא נתפסת.6. מכיוון שהחריגה לא נתפסה ב-
f1(), היא עומדת להתפשט הלאה, אך לפני כן, בלוק ה-`finally` של f1() מתבצע.- יודפס:
f1-finally7. החריגה מסוג
E2 מתפשטת אל main().8. הבלוק הראשון הוא
catch (E1 e). E2 אינה תת-מחלקה של E1 (להיפך, E1 היא תת-מחלקה של E2), לכן החריגה לא נתפסת.9. הבלוק השני הוא
catch (Exception e). מכיוון שכל חריגה היא מופע של Exception (ובאופן מפורש E2 extends Exception), החריגה נתפסת כאן.- יודפס:
EXCEPTION10. לאחר סיום בלוק ה-
catch, בלוק ה-`finally` של main() מתבצע.- יודפס:
main-finally11. התוכנית מסיימת.
הפלט הסופי לסעיף ב:
f2-finally
f1-finally
EXCEPTION
main-finally