"זורק ערמומי" בג'אווה

1. סקירה כללית

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

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

2. על זריקות ערמומי

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

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

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

3. זריקות ערמומי בפעולה

כפי שכבר הזכרנו, המהדר ו- Runtime של Jave יכולים לראות דברים שונים:

סטטי ציבורי חלל ערמומי Throw (Throwable e) זורק E {לזרוק (E) e; } ריק סטטי פרטי זורקSneakyIOException () {sneakyThrow (IOException חדש ("ערמומי")); }

המהדר רואה את החתימה עם ה- זורק את ט הוסכם לא חריגת זמן ריצה סוּג, כך שהוא מאפשר להפיץ את החריג הלא מסומן. ה- Runtime של Java לא רואה שום סוג של הטלות שכן כל הזריקות זהות פשוטות לזרוק ה.

מבחן מהיר זה מדגים את התרחיש:

@ מבחן ציבורי בטל כאשר CallSneakyMethod_thenThrowSneakyException () {נסה {SneakyThrows.throwsSneakyIOException (); } לתפוס (Exception ex) {assertEquals ("sneaky", ex.getMessage (). toString ()); }}

אפשר לזרוק חריג מסומן באמצעות מניפולציה של קוד byte, או Thread.stop (ניתן לזריקה), אבל זה מבולגן ולא מומלץ.

4. שימוש בהערות לומבוק

ה @ SneakyTrow ביאור מ- Lombok מאפשר לך לזרוק חריגים מסומנים מבלי להשתמש ב- זורק הַצהָרָה. זה שימושי כאשר אתה צריך להעלות חריג משיטה בממשקים מגבילים מאוד כמו ניתן לרוץ.

נגיד שאנחנו זורקים חריג מתוך a ניתן לרוץ; זה יועבר רק ל פְּתִיל'ס מטפל חריג שלא מטופל.

קוד זה יזרוק את יוצא מן הכלל למשל, כך שאין צורך לעטוף אותו בא חריגת זמן ריצה:

מחלקה ציבורית SneakyRunnable מיישמת Runnable {@SneakyThrows (InterruptedException.class) run public public run () {throw new InterruptedException (); }}

חסרון בקוד זה הוא שלא תוכלו לתפוס חריג מסומן שאינו מוכרז; אז זה לא יתקבץ.

הנה הטופס הנכון לזריק חריג ערמומי:

@SneakyTrows הפעלה בטלנית ציבורית () {נסה {לזרוק InterruptedException חדש (); } לתפוס (InterruptedException e) {e.printStackTrace (); }}

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

@ מבחן ציבורי בטל כאשר CallSneakyRunnableMethod_thenThrowException () {נסה {new SneakyRunnable (). הפעל (); } לתפוס (חריג e) {assertEquals (InterruptedException.class, e.getStackTrace ()); }}

5. מסקנה

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

כמו תמיד הקוד ניתן להשיג ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found