Що викликає java.lang.reflect.InvocationTargetException?

1. Огляд

При роботі з API Java Reflection зазвичай зустрічається java.lang.reflect.InvocationTargetException . У цьому підручнику ми розглянемо його та простий приклад .

2. Причина InvocationTargetException

В основному це відбувається, коли ми працюємо з відбиваючим шаром і намагаємося викликати метод або конструктор, який видає базовий виняток сам.

Шар відбиття обгортає фактичний виняток, викликаний методом, із InvocationTargetException . Спробуємо це зрозуміти на прикладі.

Давайте напишемо клас із методом, який навмисно видає виняток:

public class InvocationTargetExample { public int divideByZeroExample() { return 1 / 0; } }

Тепер давайте застосуємо вищезазначений метод, використовуючи відображення в простому тесті JUnit 5:

InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));

У наведеному вище коді ми затвердили InvocationTargetException , який видається під час виклику методу. Важливо відзначити, що фактичний виняток - ArithmeticException - у цьому випадку - загортається у InvocationTargetException.

Зараз виникає питання, чому рефлексія спочатку не викликає фактичного винятку?

Причина полягає в тому, що вона дозволяє зрозуміти, чи стався виняток через помилку у виклику методу через шар відбиття, чи це сталося в самому методі.

3. Як обробляти InvocationTargetException ?

Тут фактичний базовий виняток є причиною InvocationTargetException , тому ми можемо використовувати Throwable.getCause (), щоб отримати більше інформації про це.

Давайте подивимося, як ми можемо використовувати getCause (), щоб отримати фактичний виняток у тому ж прикладі, що використовувався вище:

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

Тут ми використовували метод getCause () для того самого об'єкта виключення, який був кинутий. І ми ствердили ArithmeticException.class як причину винятку.

Отже, як тільки ми отримаємо базовий виняток, ми можемо перекинути те саме, обернути його в якийсь спеціальний виняток або просто зареєструвати виняток на основі наших вимог.

4. Висновок

У цій короткій статті ми бачили, як шар відбиття обгортає будь-який основний виняток. Ми також побачили, як визначити основну причину InvocationTargetException і як на простому прикладі обробити такий сценарій.

Як зазвичай, код, використаний у цій статті, доступний на GitHub.