Что может вызвать 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
.Используйте getCause (метод)
на
InvocationTargetException`, чтобы получить исходное исключение.Из Javadoc метода Method.invoke()
Это исключение выбрасывается, если вызванный метод выбросил исключение.
Что InvocationTargetException-это, наверное, заканчивали свой
ArrayIndexOutOfBoundsException
. Никто не знает заранее, когда с помощью отражения, что метод может бросить -- так, а не используя подход бросает исключение, все исключения ловятся и завернутый в InvocationTargetException`.Это будет печатать точные строки кода в отдельный метод, который при вызове, поднял исключение:
Это описывает что-то вроде:
Можно сравнить с оригиналом исключения, используя класс getCause() метод такой :
У меня был
Ява.яз.отразить.Ошибка InvocationTargetException с заявлением, в котором призвали объект логгера во внешнем
классв
попробоватьблок
пойматьв моей
класс`.Пошаговое выполнение кода в отладчике &амп затмение; при наведении курсора мыши на утверждение регистратора я видел объект логгера
было `нуль` (какие-то внешние константы должны быть инстанцирован в самом верху класса моя
).Это исключение выдается, если основной метод(так называемый метод с помощью рефлексии) бросает исключение.
Поэтому, если метод, который был вызван API рефлексии, вызывает исключение (как, например, исключение на этапе выполнения), отражение API будет обернуть исключение в InvocationTargetException.
Я столкнулся с той же проблемой. Я использовал е.getCause().getCause() потом я нашел, что это было из-за неправильных параметров, которые я проходил. Там был NullPointerException в выборке значение одного из параметров. Надеюсь, что это поможет вам.
Ошибка исчезла после того как я сделал Чистые>запустить xdoclet все-и GT;запустить xPackaging.
В моей рабочей области, в ecllipse.