מה גורם ל- java.lang.reflect.InvocationTargetException?

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

כשעובדים עם Java Reflection API, זה נפוץ להיתקל java.lang.reflect.InvocationTargetException. במדריך זה, נבחן את זה וכיצד לטפל בזה בדוגמה פשוטה.

2. סיבה של InvocationTargetException

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

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

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

מחלקה ציבורית InvocationTargetExample {public int divideByZeroExample () {return 1/0; }}

עכשיו, בואו נפעיל את השיטה שלעיל באמצעות השתקפות במבחן JUnit 5 פשוט:

InvocationTargetExample targetExample = חדש InvocationTargetExample (); שיטת שיטה = InvocationTargetExample.class.getMethod ("divideByZeroExample"); חריג חריג = assertThrows (InvocationTargetException.class, () -> method.invoke (targetExample));

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

כעת, השאלה שעולה בראש היא מדוע מלכתחילה ההשתקפות אינה מעמידה את החריג בפועל?

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

3. כיצד לטפל InvocationTargetException?

כאן, החריג הבסיסי בפועל הוא הגורם ל InvocationTargetException, אז אנחנו יכולים להשתמש Throwable.getCause () כדי לקבל מידע נוסף על כך.

בואו נראה איך נוכל להשתמש getCause () כדי לקבל את החריג בפועל באותה דוגמה ששימשה לעיל:

assertEquals (ArithmeticException.class, exception.getCause (). getClass ());

הנה, השתמשנו ב- getCause () שיטה על אותו דבר יוצא מן הכלל חפץ שנזרק. וקבענו ArithmeticException.class כגורם לחריג.

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

4. מסקנה

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

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


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