Какво може да причини 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
и ще стигнете до първоначалната.Изключението се хвърля, ако
Така че, ако методът, който е извикан с API на отражението, хвърли изключение (например изключение по време на изпълнение), API на отражението ще обгърне изключението в
InvocationTargetException
.От Javadoc на Method.invoke()
Това изключение се хвърля, ако извиканият метод е хвърлил изключение.