Я пытался понять и прочитать, что может вызвать это, но я просто не могу понять:
У меня есть это где-то в моем коде:
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
и вы получите исходную.
Исключение возникает, если
InvocationTargetException - если базовый метод выбрасывает исключение.
Таким образом, если метод, который был вызван с помощью API отражения, выбрасывает исключение (например, исключение времени выполнения), API отражения обернет исключение в InvocationTargetException
.
Используйте getCause (метод)на
InvocationTargetException`, чтобы получить исходное исключение.
Из Javadoc метода Method.invoke()
Бросает: InvocationTargetException - если базовый метод выбрасывает исключение.
Это исключение выбрасывается, если вызванный метод выбросил исключение.
Что InvocationTargetException-это, наверное, заканчивали свой ArrayIndexOutOfBoundsException
. Никто не знает заранее, когда с помощью отражения, что метод может бросить -- так, а не используя подход бросает исключение, все исключения ловятся и завернутый в InvocationTargetException`.
Это будет печатать точные строки кода в отдельный метод, который при вызове, поднял исключение:
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
Это описывает что-то вроде:
InvocationTargetException-это проверенное исключение, которое оборачивается исключение вызываемый метод или конструктор. Начиная с версии 1.4, это исключение было retrofitted, чтобы соответствовать исключения-цепочки механизму общего назначения. В "цель исключения", что это обеспечен во время и доступ через getTargetException() метод теперь известен как причина, и может быть доступ через Throwable.getCause() метод, а также вышеупомянутая "и устаревший метод.&и"
Можно сравнить с оригиналом исключения, используя класс getCause() метод такой :
try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
}
У меня был Ява.яз.отразить.Ошибка InvocationTargetException с заявлением, в котором призвали объект логгера во внешнем
классв
попробоватьблок
пойматьв моей
класс`.
Пошаговое выполнение кода в отладчике &амп затмение; при наведении курсора мыши на утверждение регистратора я видел объект логгера было `нуль` (какие-то внешние константы должны быть инстанцирован в самом верху класса моя
).
Это исключение выдается, если основной метод(так называемый метод с помощью рефлексии) бросает исключение.
Поэтому, если метод, который был вызван API рефлексии, вызывает исключение (как, например, исключение на этапе выполнения), отражение API будет обернуть исключение в InvocationTargetException.
Я столкнулся с той же проблемой. Я использовал е.getCause().getCause() потом я нашел, что это было из-за неправильных параметров, которые я проходил. Там был NullPointerException в выборке значение одного из параметров. Надеюсь, что это поможет вам.
Ошибка исчезла после того как я сделал Чистые>запустить xdoclet все-и GT;запустить xPackaging.
В моей рабочей области, в ecllipse.