Какво може да причини java.lang.reflect.InvocationTargetException?

Опитах се да разбера и да прочета какво може да го причини, но просто не мога да го разбера:

Имам това някъде в кода си:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

Работата е там, че когато се опитва да извика някакъв метод, той хвърля InvocationTargetException вместо някое друго очаквано изключение (по-конкретно ArrayIndexOutOfBoundsException). Тъй като всъщност знам какъв метод се извиква, отидох направо в кода на този метод и добавих try-catch блок за реда, който би трябвало да хвърли ArrayIndexOutOfBoundsException, и той наистина хвърли ArrayIndexOutOfBoundsException, както се очакваше. И все пак, когато се изкачва нагоре по някакъв начин се променя на InvocationTargetException и в кода по-горе catch(Exception e) e е InvocationTargetException, а не ArrayIndexOutOfBoundsException. както се очакваше.

Какво би могло да причини такова поведение или как мога да проверя такова нещо?

Решение

Добавили сте допълнително ниво на абстракция, като сте извикали метода с отразяване. Нивото на отразяване обвива всяко изключение в InvocationTargetException, което ви позволява да различите изключението, всъщност причинено от грешка в извикването на отразяването (може би списъкът ви с аргументи не е бил валиден, например), от грешка в рамките на извикания метод.

Просто развийте причината в рамките на InvocationTargetException и ще стигнете до първоначалната.

Коментари (14)

Изключението се хвърля, ако

InvocationTargetException - ако основният метод хвърля изключение.

Така че, ако методът, който е извикан с API на отражението, хвърли изключение (например изключение по време на изпълнение), API на отражението ще обгърне изключението в InvocationTargetException.

Коментари (1)

От Javadoc на Method.invoke()

Хвърля: InvocationTargetException - ако основният метод хвърля изключение.

Това изключение се хвърля, ако извиканият метод е хвърлил изключение.

Коментари (2)