ב-Java, יוצא מן הכלל הוא אירוע המתרחש במהלך ביצוע תוכנית ומשבש את הזרימה הרגילה של הוראות התוכנית. באגים או שגיאות שאיננו רוצים ומגבילים את הביצוע הרגיל של הקוד של התוכנית שלנו נקראים חריגים . בחלק זה נתמקד ב סוגי חריגים ב-Java וההבדלים בין השניים.
ניתן לסווג חריגים לשתי דרכים:
- חריגים מובנים
- מסומן חריגה
- חריגה לא מסומנת
- חריגים בהגדרת משתמש
חריגה מובנית
חריגים שכבר זמינים ב ספריות Java מכונים חריג מובנה . חריגים אלה מסוגלים להגדיר את מצב השגיאה כך שנוכל להבין את הסיבה לקבלת שגיאה זו. ניתן לסווג אותו לשתי קטגוריות רחבות, כלומר, בדק חריגים ו חריג לא מסומן .
מסומן חריגה
בָּדוּק יוצאי דופן נקראים זמן קומפילציה חריגים מכיוון שהחריגים הללו נבדקים בזמן ההידור על ידי המהדר. המהדר מוודא אם המתכנת מטפל בחריג או לא. המתכנת צריך לטפל בחריג; אחרת, המערכת הציגה שגיאת קומפילציה.
CheckedExceptionExample.java
import java.io.*; class CheckedExceptionExample { public static void main(String args[]) { FileInputStream file_data = null; file_data = new FileInputStream('C:/Users/ajeet/OneDrive/Desktop/Hello.txt'); int m; while(( m = file_data.read() ) != -1) { System.out.print((char)m); } file_data.close(); } }
בקוד לעיל, אנו מנסים לקרוא את Hello.txt קובץ ולהציג את הנתונים או התוכן שלו על המסך. התוכנית זורקת את החריגים הבאים:
מספר אקראי של java
- ה FileInputStream(שם קובץ) הקונסטרוקטור זורק את FileNotFoundException זה מסומן חריג.
- ה לקרוא() שיטת ה FileInputStream הכיתה זורק את IOException .
- ה סגור() השיטה גם זורקת את ה-IOException.
תְפוּקָה:
איך פותרים את השגיאה?
יש בעצם שתי דרכים שבאמצעותן נוכל לפתור את השגיאות הללו.
1) החריגים מתרחשים בשיטה הראשית. אנו יכולים להיפטר משגיאות הקומפילציה אלו על ידי הכרזה על החריג בשיטה הראשית באמצעות ההטלות אנו מצהירים רק על ה-IOException, לא על FileNotFoundException, בגלל מערכת היחסים בין הילד להורה. מחלקת IOException היא מחלקת האב של FileNotFoundException, כך שהחריג הזה יכסה אוטומטית על ידי IOException. אנו נכריז על החריג באופן הבא:
class Exception{ public static void main(String args[]) throws IOException { ... ... }
אם נקמפל ונפעיל את הקוד, השגיאות ייעלמו, ונראה את הנתונים של הקובץ.
רשימת ג'אווה ממוינת
2) אנו יכולים גם לטפל בחריגים אלה באמצעות נסה לתפוס עם זאת, הדרך בה השתמשנו לעיל אינה נכונה. עלינו לתת מסר משמעותי עבור כל סוג חריג. על ידי כך יהיה קל להבין את השגיאה. נשתמש בבלוק ה-try-catch בצורה הבאה:
Exception.java
import java.io.*; class Exception{ public static void main(String args[]) { FileInputStream file_data = null; try{ file_data = new FileInputStream('C:/Users/ajeet/OneDrive/Desktop/programs/Hell.txt'); }catch(FileNotFoundException fnfe){ System.out.println('File Not Found!'); } int m; try{ while(( m = file_data.read() ) != -1) { System.out.print((char)m); } file_data.close(); }catch(IOException ioe){ System.out.println('I/O error occurred: '+ioe); } } }
אנו נראה הודעת שגיאה נכונה 'הקובץ לא נמצא!' על המסוף כי אין קובץ כזה במיקום זה.
חריגים לא מסומנים
ה לא בדוק יוצאי דופן הם בדיוק מנוגדים ל בָּדוּק חריגים. המהדר לא יבדוק את החריגים הללו בזמן ההידור. במילים פשוטות, אם תוכנית זורקת חריג לא מסומן, וגם אם לא טיפלנו או הכרזנו עליו, התוכנה לא תיתן שגיאת קומפילציה. בדרך כלל, זה מתרחש כאשר המשתמש מספק נתונים גרועים במהלך האינטראקציה עם התוכנית.
הערה: המחלקה RuntimeException מסוגלת לפתור את כל החריגים שלא מסומנים בגלל הקשר בין ילד להורה.
UncheckedExceptionExample1.java
class UncheckedExceptionExample1 { public static void main(String args[]) { int postive = 35; int zero = 0; int result = positive/zero; //Give Unchecked Exception here. System.out.println(result); } }
בתוכנית לעיל, חילקנו 35 ב-0. הקוד יקומפילד בהצלחה, אבל הוא יזרוק שגיאת ArithmeticException בזמן ריצה. על חלוקת מספר ב-0 זורק את החלוקה באפס חריג שהוא חריג ביטול הסימון.
תְפוּקָה:
UncheckedException1.java
class UncheckedException1 { public static void main(String args[]) { int num[] ={10,20,30,40,50,60}; System.out.println(num[7]); } }
תְפוּקָה:
בקוד לעיל, אנו מנסים להשיג את האלמנט הממוקם בעמדה 7, אך אורך המערך הוא 6. הקוד מתחבר בהצלחה, אך זורק את ArrayIndexOutOfBoundsException בזמן הריצה.
חריגה מוגדרת על ידי משתמש
ב Java , יש לנו כבר כמה מחלקות חריגות מובנות כמו ArrayIndexOutOfBoundsException , NullPointerException , ו ArithmeticException . חריגים אלה מוגבלים להפעלה בכמה תנאים מוגדרים מראש. ב-Java, אנו יכולים לכתוב מחלקה חריגה משלנו על ידי הרחבת מחלקה Exception. אנו יכולים לזרוק חריג משלנו על מצב מסוים באמצעות מילת המפתח לזרוק. ליצירת חריג המוגדר על ידי משתמש, עלינו להיות בעלי ידע בסיסי ב ה נסה לתפוס לחסום ו לזרוק מילת מפתח .
בוא נכתוב א תוכנית Java וליצור חריגה מוגדרת על ידי משתמש.
UserDefinedException.java
jlist
import java.util.*; class UserDefinedException{ public static void main(String args[]){ try{ throw new NewException(5); } catch(NewException ex){ System.out.println(ex) ; } } } class NewException extends Exception{ int x; NewException(int y) { x=y; } public String toString(){ return ('Exception value = '+x) ; } }
תְפוּקָה:
תיאור:
בקוד לעיל, יצרנו שתי מחלקות, כלומר, UserDefinedException ו חריגה חדשה . ה UserDefinedException יש את השיטה העיקרית שלנו, ואת חריגה חדשה class היא מחלקה חריגה המוגדרת על ידי המשתמש שלנו, שמתרחבת יוצא מן הכלל . בתוך ה חריגה חדשה class, אנו יוצרים משתנה איקס מסוג מספר שלם ולהקצות לו ערך בבנאי. לאחר הקצאת ערך למשתנה זה, נחזיר את הודעת החריגה.
בתוך ה UserDefinedException כיתה, הוספנו א נסה לתפוס לַחסוֹם. בקטע הניסיון, אנו זורקים את החריג, כלומר, חריגה חדשה ולהעביר אליו מספר שלם. הערך יועבר למחלקה NewException ויחזיר הודעה. אנו תופסים את ההודעה בגוש ה-catch ומציגים אותה על המסך.
ההבדל בין חריגה מסומנת לבלתי מסומנת
כן לא | מסומן חריגה | חריגה לא מסומנת |
---|---|---|
1. | חריגים אלה נבדקים בזמן ההידור. חריגים אלה מטופלים גם בזמן ההידור. | חריגים אלה בדיוק מנוגדים לחריגים המסומנים. חריגים אלה אינם נבדקים ומטופלים בזמן הקומפילציה. |
2. | חריגים אלה הם תת-מחלקות ישירות של חריג אך לא מורחבות ממחלקה RuntimeException. | הם מחלקות המשנה הישירות של מחלקת RuntimeException. |
3. | הקוד נותן שגיאת קומפילציה במקרה שבו מתודה זורקת חריג מסומן. המהדר אינו מסוגל להתמודד עם החריגה בעצמו. | הקוד מתקדם ללא כל שגיאה מכיוון שהחריגים חומקים ממודעות המהדר. חריגים אלה הם תוצאות של שגיאות שנוצרו על ידי המשתמש בלוגיקת התכנות. |
4. | חריגים אלו מתרחשים לרוב כאשר ההסתברות לכישלון גבוהה מדי. | חריגים אלו מתרחשים בעיקר עקב טעויות תכנות. |
5. | חריגים נפוצים מסומנים כוללים IOException, DataAccessException, InterruptedException וכו'. | חריגים נפוצים שאינם מסומנים כוללים ArithmeticException, InvalidClassException, NullPointerException וכו'. |
6. | חריגים אלה מופצים באמצעות מילת המפתח זריקה. | אלה מופצים אוטומטית. |
7. | נדרש לספק את חסימת ה-Try-catch וה-Try-Final כדי לטפל בחריג המסומן. | במקרה של חריגה לא מסומנת זה לא חובה. |
באגים או שגיאות שאיננו רוצים ומגבילים את הביצוע הרגיל של התוכניות נקראים חריגים .
ArithmeticException, ArrayIndexOutOfBoundExceptions, ClassNotFoundExceptions וכו' באים בקטגוריה של חריגה מובנית . לפעמים, החריגים המובנים אינם מספיקים כדי להסביר או לתאר מצבים מסוימים. כדי לתאר מצבים אלה, עלינו ליצור חריגים משלנו על ידי יצירת מחלקת חריג כתת-מחלקה של יוצא מן הכלל מעמד. סוגים אלה של חריגים מגיעים בקטגוריה של חריגה בהגדרת משתמש .