ההבדל בין זריקה לזרוק בג'אווה

1. הקדמה

במדריך זה, נסתכל על ה- לזרוק ו זורק בג'אווה. נסביר מתי עלינו להשתמש בכל אחד מהם.

לאחר מכן נציג כמה דוגמאות לשימוש הבסיסי בהן.

2. לזרוק ו זורק

נתחיל בהקדמה מהירה. מילות מפתח אלה קשורות לטיפול בחריגים. יוצאים מהכלל חריגות כאשר נורמלי הזרימה של היישום שלנו מופרע.

יכולות להיות הרבה סיבות. משתמש יכול לשלוח נתוני קלט שגויים. אנו עלולים לאבד קשר או מצב אחר בלתי צפוי עלול להתרחש. טיפול בחריגים טובים הוא המפתח לשמירת היישום שלנו לאחר הופעת אותם רגעים לא נעימים.

אנו משתמשים לזרוק מילת מפתח כדי לזרוק במפורש חריג מהקוד. זו יכולה להיות כל שיטה או בלוק סטטי. חריג זה חייב להיות תת-מחלקה של זורק. כמו כן, זה יכול להיות א זורק את עצמה. איננו יכולים לשים חריגים מרובים עם יחיד לזרוק.

זורק ניתן למקם מילת מפתח בהצהרת השיטה. זה מציין אילו חריגים ניתן לזרוק משיטה זו. עלינו להתמודד עם חריגים אלה באמצעות ניסיון לתפוס.

שתי מילות המפתח הללו אינן ניתנות להחלפה!

3. לזרוק בג'אווה

בואו נסתכל על דוגמה בסיסית עם השלכת חריג מהשיטה.

קודם כל, דמיין שאנחנו כותבים מחשבון פשוט. אחת הפעולות הבסיסיות בחשבון היא החלוקה. בשל כך, התבקשנו ליישם תכונה זו:

חלוקה כפולה ציבורית (כפול a, כפול b) {להחזיר a / b; }

מכיוון שאיננו יכולים לחלק באפס, עלינו להוסיף כמה שינויים בקוד הקיים שלנו. נראה שזה רגע טוב להעלות חריג.

בוא נעשה את זה:

מחלק כפול ציבורי (כפול a, כפול b) {if (b == 0) {זרוק ArithmeticException ("מחלק לא יכול להיות שווה לאפס!"); } להחזיר את a / b; }

כפי שאתה יכול לראות, השתמשנו חישוב חשבון מתאים באופן מושלם לצרכים שלנו. אנחנו יכולים לעבור סינגל חוּט פרמטר קונסטרוקטור שהוא הודעת חריג.

3.1. אימונים טובים

עלינו תמיד להעדיף את החריג הספציפי ביותר. עלינו למצוא שיעור המתאים ביותר לאירוע יוצא הדופן שלנו. למשל, לזרוק NumberFormatException במקום IllegalArgumentException. עלינו להימנע מלזרוק תמונה לא ספציפית יוצא מן הכלל.

לדוגמא, יש מספר שלם כיתה ב java.lang חֲבִילָה. בואו נסתכל על אחת מהצהרת שיטות המפעל:

public static Integer valueOf (String s) זורק NumberFormatException 

זוהי שיטת מפעל סטטית שיוצרת מספר שלם מופע מ חוּט. במקרה של קלט שגוי חוּט, השיטה תזרוק NumberFormatException.

רעיון טוב הוא להגדיר את החריג התיאורי שלנו. בשלנו מַחשְׁבוֹן כיתה שיכולה להיות למשל DivideByZeroException.

בואו נסתכל על יישום לדוגמא:

מחלקה ציבורית DivideByZeroException מרחיב RuntimeException {public DivideByZeroException (הודעת מחרוזת) {super (הודעה); }}

3.2. עוטף חריג קיים

לפעמים אנו רוצים לעטוף חריג קיים בחריג שהגדרנו.

נתחיל בהגדרת החריג שלנו:

מחלקה ציבורית DataAcessException מרחיב RuntimeException {public DataAcessException (הודעת מחרוזת, סיבה הניתנת לזריקה) {super (הודעה, סיבה); }}

הקונסטרוקטור לוקח שני פרמטרים: הודעת חריג וסיבה, שעשויה להיות כל תת-מחלקה של זורק.

בוא נכתוב יישום מזויף עבור מצא הכל() פוּנקצִיָה:

רשימה ציבורית findAll () זורק SQLException {זרוק SQLException חדש (); }

עכשיו, ב SimpleService בואו נקרא לפונקציה מאגר, שיכולה לגרום ל- SQLException:

wrappingExpeption חלל ציבורי () {try {personRepository.findAll (); } לתפוס (SQLException e) {לזרוק DataAccessException חדש ("Exception SQL", e); }}

אנחנו זורקים מחדש SQLException עטוף בחריג שלנו שנקרא DataAccessException. הכל מאומת על ידי הבדיקה הבאה:

@Test בטל כאשרSQLExceptionIsThrown_thenShouldBeRethrownWithWrappedException () {assertThrows (DataAccessException.class, () -> simpleService.wrappingException ()); }

ישנן שתי סיבות לעשות זאת. ראשית, אנו משתמשים בעטיפת חריגים, מכיוון ששאר הקוד לא צריך לדעת על כל חריג אפשרי במערכת.

גם רכיבים ברמה גבוהה יותר אינם צריכים לדעת על רכיבים ברמה התחתונה, ולא על היוצאים מן הכלל שהם יוצרים.

3.3. Multi-Catch עם Java

לפעמים השיטות בהן אנו משתמשים יכולות לזרוק הרבה יוצאי דופן שונים.

בואו נסתכל על בלוק נסיון לתפוס נרחב יותר:

נסה {tryCatch.execute (); } לתפוס (ConnectionException | SocketException ex) {System.out.println ("IOException"); } לתפוס (Exception ex) {System.out.println ("חריג כללי"); }

ה לבצע השיטה יכולה לזרוק שלושה יוצאים מן הכלל: SocketException, ConnectionException, Exception. גוש התפיסה הראשון יתפוס ConnectionException אוֹ SocketException. גוש התפיסה השני יתפוס יוצא מן הכלל או כל תת מחלקה אחרת של יוצא מן הכלל. זכור את זה עלינו לתפוס תחילה חריג מפורט יותר.

אנחנו יכולים להחליף את סדר בלוקי התפיסה שלנו. ואז, לעולם לא נתפוס SocketException ו ConnectionException כי הכל ילך לתפוס עם יוצא מן הכלל.

4. זורק בג'אווה

אנחנו מוסיפים זורק להצהרת השיטה.

בואו נסתכל על אחת מהצהרות השיטה הקודמות שלנו:

חלל סטטי ציבורי לבצע () זורק SocketException, ConnectionException, Exception

השיטה עשויה לזרוק חריגים מרובים. הם מופרדים בפסיקים בסוף הכרזת שיטה. אנו יכולים להכניס חריגים משניים, מסומנים ולא מסומנים זורק. תארנו להלן את ההבדל ביניהם.

4.1. חריגים מסומנים ולא מסומנים

חריג מסומן פירושו שהוא נבדק בזמן הקומפילציה. שים לב, שעלינו לטפל בחריג זה. אחרת, שיטה חייבת לציין חריג באמצעות זורק מילת מפתח.

יוצאי הדופן הנפוצים ביותר הם IOException, FileNotFoundException, ParseException. FileNotFoundException עשוי להיזרק כשאנחנו יוצרים FileInputStream מ קוֹבֶץ.

יש דוגמה קצרה:

קובץ קובץ = קובץ חדש ("not_existing_file.txt"); נסה {FileInputStream stream = FileInputStream חדש (קובץ); } לתפוס (FileNotFoundException e) {e.printStackTrace (); }

אנו יכולים להימנע משימוש בלוק לתפוס על ידי הוספה זורק להצהרת השיטה:

ריק סטטי פרטי uncheckedException () זורק FileNotFoundException {File file = קובץ חדש ("not_existing_file.txt"); זרם FileInputStream = FileInputStream חדש (קובץ); }

למרבה הצער, פונקציה ברמה גבוהה יותר עדיין צריכה להתמודד עם חריג זה. אחרת, עלינו לשים את החריג הזה בהצהרת שיטה עם זורק מילת מפתח.

להפך, חריגים לא מסומנים אינם נבדקים בזמן הקומפילציה.

החריגים הנפוצים ביותר שאינם מסומנים הם: ArrayIndexOutOfBoundsException, IllegalArgumentException, NullPointerException.

חריגים לא מסומנים נזרקים במהלך זמן הריצה. הקוד הבא יזרוק א NullPointerException. כנראה שזה אחד החריגים הנפוצים ביותר ב- Java.

קריאה לשיטה בהתייחסות אפס תביא לחריג זה:

זמן ריצה ריק חלל NullPointerException () {מחרוזת a = null; א.אורך (); }

בואו נאמת התנהגות זו במבחן:

@Test בטל כאשרCalled_thenNullPointerExceptionIsThrown () {assertThrows (NullPointerException.class, () -> simpleService.runtimeNullPointerException ()); }

אנא זכור כי קוד ובדיקה זו אינם רבים. זה רק למטרות למידה כדי להסביר חריגים בזמן ריצה.

בג'אווה, כל מחלקות משנה של שְׁגִיאָה ו חריגת זמן ריצה הוא חריג לא מסומן. חריג מסומן הוא כל השאר זורק מעמד.

5. מסקנה

במאמר זה דנו בהבדל בין שתי מילות מפתח ב- Java: לזרוק ו זורק. עברנו את השימוש הבסיסי ודיברנו קצת על שיטות עבודה מומלצות. ואז דיברנו על חריגים בדוקים ולא מסומנים.

כמו תמיד, ניתן למצוא את קוד המקור ב- GitHub שלנו.

אם ברצונך להעמיק בטיפול בחריגים ב- Java, עיין במאמר שלנו על חריגות Java.