תכנות מתקדם ב-Java/חריגות זמן ריצה: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Johnny Zoo (שיחה | תרומות)
אין תקציר עריכה
Johnny Zoo (שיחה | תרומות)
אין תקציר עריכה
שורה 64:
 
</source>
בלוק ה-Catch מקבל את החריגה שנזרקה, במקרה הזה - הבלוק הראשון מקבל חריגה מסוג {{קוד בשורה|SomeException}} בשם {{קוד בשורה|e1}}, והבלוק השני מקבל חריגה מסוג {{קוד בשורה|AnotherException}} בשם {{קוד בשורה|e2}}. עם החריגה שקיבלנו אפשר לעשות כל מיני דברים: לקרוא ממנה נתונים הקשורים לבעייה שבגללה אירעה החריגה, לזרוק אותה הלאה, וכדומה. אם לא תפסנו את החריגה באף אחד מבלוקי ה-Catch, הטיפול בה יהיה בדיוק כמו הטיפול בכל חריגה שלא נתפסה.
הערה: בלוקים של Try ו-Catch, כמו בלוקים אחרים (למשל: לולאת For), נחשבים כתחום הגדרה בפני עצמו. המשמעות היא שאם הגדרתם משתנה בתוך בלוק Try - הוא לא יוכר מחוץ לבלוק. כדי לעקוף את הבעייה, רצוי להגדיר משתנים (כאלה שיש להם משמעות גם מחוץ לבלוק) לפני הכניסה לבלוק ה-Try ולתת להם ערך Nullהתחלתי ריק כלשהו (אם מדובר באובייקטים, Null).
 
===בלוק Finally===
שורה 98:
 
==שימוש בחריגות==
ראינו כבר כיצד תופסים חריגות שנזרקו על ידי שיטות מובנות של ג'אווה. כעת נראה כיצד משתמשים במנגנון החריגות בתוכניות שאנחנו נכתוב.
 
זריקה של חריגה מתבצעת בעזרת הפקודה {{קוד בשורה|throw}}, בצורה הבאה:
{{קוד|throw <exception>}}
כאשר במקום {{קוד בשורה|<exception>}} נכתוב מהי החריגה שנרצה לזרוק, עם הפרמטרים המתאימים. חריגה שניתן לזרוק היא כל מחלקה שמרחיבה את המחלקה המובנית {{קוד בשורה|Exception}}. הספריות הבסיסיות של ג'אווה מכילות סוגי חריגות רבים (שאת חלקם כבר ראיתם, כמו - {{קוד בשורה|NullPointerException}}), וניתן ליצור בקלות גם סוגים חדשים של חריגות. בדרך כלל, השם של מחלקות כאלה יכלול בסופו את המילה Exception. זה לא הכרחי, אבל רצוי לדבוק במנהג זה כדי שאפשר יהיה לזהות בקלות מחלקות שהן חריגות זמן ריצה.
 
===דוגמאות===
אם כך, כדי לזרוק חריגה חדשה מטיפוס {{קוד בשורה|Exception}} (החריגה הבסיסית ביותר), נשתמש בפקודה:
{{קוד|throw new Exception();}}
כדי לזרוק חריגה מטיפוס {{קוד בשורה|RunTimeException}} עם הפרמטר {{קוד בשורה|"Illegal Input"}}, נשתמש בפקודה:
{{קוד|throw new RunTimeException("Illegal Input");}}
 
===מתי משתמשים בחריגות===
ככלל, מיועד השימוש בחריגות למצבים בהם ההתנהגות של התוכנית אינה ברורה, למשל - קובץ לא נמצא, או לא מצליח להיפתח, פנייה לאיבר לא חוקי במערך, וכן הלאה. היתרון של שימוש בחריגות הוא שהמשתמש יכול לקבוע בעצמו מה תהייה ההתנהגות של התוכנית במצב לא צפוי (לדוגמה - תדפיס הודעה מתאימה, תקרוס, תתעלם, תנסה לפתור את הבעייה).
 
עם זאת, חריגות הן אובייקטים, ושימוש בהן כרוך בעלות מסויימת מבחינת זיכרון וזמן ריצה. בעייה נוספת היא ששימוש בחריגות מכריח אותנו להוסיף בלוקים של Try ושל Catch, והתוצאה היא קוד ארוך יותר ופחות נוח לקריאה. לכן, כדאי להשתמש בחריגות רק כאשר הן נחוצות.
 
דוגמה (מוקצנת מעט) לשימוש מיותר בחריגה:
שורה 130 ⟵ 143:
</source>
 
זוהי דרך גרועה להשתמש בחריגות, מכיוון שניתן היה לבצע את אותה פעולה בצורה פשוטה וחסכונית יותר עם בדיקה פשוטה. נראה דוגמה לשימושדומה, בה השימוש ראוי יותר:
 
<source lang = "java">
שורה 166 ⟵ 179:
===היררכייה של חריגות===
 
===כתיבה של מחלקות חריגות חדשות===
 
{{תכנות מתקדם ב-Java|מוגבל}}