חריג מסומן לעומת חריג בזמן ריצה
חריגים הם סוג מיוחד של אירועים, שעלולים להפריע לזרימת התוכנית הרגילה. השם חריג מגיע מ"אירוע חריג". זריקת חריגה היא תהליך של יצירת אובייקט חריג ומסירתו למערכת זמן הריצה. כאשר מערכת זמן הריצה תקבל את אובייקט החריגה, היא תנסה למצוא מישהו שיטפל בו בתוך מחסנית השיחות על ידי מעבר בו בסדר הפוך (בו נקראו המתודות). מערכת זמן הריצה מצליחה אם היא מוצאת שיטה עם מטפל חריג. מטפל חריגים הוא גוש קוד שיכול לטפל באופן רשמי בחריג האמור.אם מערכת זמן הריצה תמצא מטפל מתאים, היא תעביר את אובייקט החריגה למטפל. זה נקרא לתפוס את החריג. עם זאת, אם לא ניתן לטפל בחריג, התוכנית תסתיים. ב-Java, חריגים יורשים ממחלקה Throwable. חריגים מסומנים הם חריגים שבהם הטיפול נאכף על ידי המהדר. חריגים בזמן ריצה הם סוג של חריגים, שאינם נבדקים על ידי המהדר.
מהי חריגה מסומנת?
חריגים מסומנים הם אובייקטים של המחלקה java.lang.exception או מחלקות המשנה שלה (למעט java.lang. RuntimeException ומחלקות המשנה שלה). חריגים מסומנים "נבדקים" בזמן ההידור. זה אומר שהמתכנת חייב לתפוס או לזרוק את החריגים האלה, אחרת ההידור יתלונן (יגרום לשגיאת מהדר). מסיבה זו, חריגים מסומנים רבים ידועים היטב למתכנתים. לדוגמה, ה-IOException ותתי המחלקות שלו הם חריגים שנבדקו, ובכל פעם שהמתכנת מתמודד עם גישה או שינוי של קובץ, המהדר בודק כדי לוודא שכל ה-IOExceptions האפשריים מטופלים על ידי המתכנת.
מהי חריגה בזמן ריצה?
חריגי זמן ריצה מורכבים מ-java.lang. RuntimeException וכל מחלקות המשנה שלו. באופן תיאורטי, הם משרתים את אותה מטרה כמו חריגים מסומנים, וניתן לזרוק אותם או לטפל בהם כמו חריג מסומן, אך הטיפול בהם אינו נאכף על ידי המהדר. לכן, חריגים בזמן ריצה שייכים למשפחת החריגים הלא מסומנים. NullPointerException, NumberFormatEception, ClassCastException ו-ArrayIndexOutOfBoundsException הם חריגים נפוצים בזמן ריצה ב-Java.
מה ההבדל בין חריגה מסומנת לחריגה בזמן ריצה?
למרות שגם חריגים מסומנים וגם חריגים בזמן ריצה הם התרחשות לא רצויה במהלך הפעלת תוכנית, יש ביניהם הבדלים. טיפול בחריגים מסומנים נאכף על ידי המהדר, אך חריגים בזמן ריצה אינם. לכן, יש לזרוק או לטפל בחריגים מסומנים כדי שהקוד יתבצע קומפילציה, אך אין דרישה כזו לגבי חריגים בזמן ריצה.כתוצאה מכך, חריגים בזמן ריצה שייכים לקטגוריית חריגים לא מסומנים יחד עם שגיאות.
החיסרון בחריגים מסומנים הוא שהמתכנתת צריכה לטפל בזה גם אם היא לא יודעת איך לעשות זאת. לכן, אם המתכנת פשוט זורק חריג חדש מבלי לעטוף את המקור, מעקב המחסנית השייך לחריג המקורי יאבד. זה המקום שבו יוצאי דופן בזמן ריצה שימושיים. מכיוון שניתן לטפל בכל החריגות בזמן הריצה במקום אחד, ולכן מתכנתים יכולים לכתוב פחות כמות קוד. מצד שני, מכיוון שיש לתפוס חריגים מסומנים, אין שום הפתעה למתכנת. היא תמיד תדע איזה חריג מסומן יכול להיזרק בשיטה מסוימת. בניגוד לכך, ניתן לזרוק חריגים שונים בזמן ריצה ללא ידיעת המתכנת.