Что может вызвать 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
как ожидалось.
Что может вызвать такое поведение или как я могу это проверить?
Ответы
Ответ 1
Вы добавили дополнительный уровень абстракции, вызвав метод с отражением. Отражающий слой обертывает любое исключение в InvocationTargetException
, которое позволяет рассказать о различии между исключением, фактически вызванным сбоем в вызове отражения (возможно, например, ваш список аргументов недействителен) и сбой в методе, называемом.
Просто распакуйте причину в InvocationTargetException
, и вы перейдете к исходному.
Ответ 2
Исключение выбрано, если
InvocationTargetException - если базовый метод генерирует исключение.
Итак, если метод, который был вызван с API-интерфейсом отражения, генерирует исключение (например, исключение среды выполнения), API-интерфейс отражения превратит исключение в InvocationTargetException
.
Ответ 3
Используйте метод getCause()
в InvocationTargetException
для извлечения исходного исключения.
Ответ 4
Из Javadoc метода .invoke()
Throws: InvocationTargetException - если базовый метод выдает исключение.
Это исключение вызывается, если вызванный метод вызывает исключение.
Ответ 5
Это будет печатать точную строку кода в конкретном методе, который при вызове вызывает исключение:
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
Ответ 6
Это InvocationTargetException
, вероятно, завершает ваш ArrayIndexOutOfBoundsException
. При использовании рефлексии нельзя сказать, что может использовать этот метод, поэтому вместо использования подхода throws Exception
все исключения будут пойманы и завернуты в InvocationTargetException
.
Ответ 7
В этом описывается что-то вроде
InvocationTargetException - это исключенное исключение, которое обертывает исключение, вызванное вызываемым методом или конструктором. С момента выпуска 1.4, это исключение было модифицировано в соответствии с механизмом исключения исключений общего назначения. "Целевое исключение", которое предоставляемых во время строительства и доступ через Метод getTargetException() теперь известен как причина, и может быть доступ через метод Throwable.getCause(), а также вышеупомянутый "унаследованный метод".
Ответ 8
Вы можете сравнить с исходным классом исключения с использованием метода getCause() следующим образом:
try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
}
Ответ 9
У меня была ошибка java.lang.reflect.InvocationTargetException
из оператора, вызывающего объект logger во внешнем class
внутри блока try
/catch
в моем class
.
Выполнив код в отладчике Eclipse и наведя указатель мыши на инструкцию logger, я увидел, что object
logger был null
(некоторые внешние константы должны были быть созданы в самом начале моего class
).
Ответ 10
Это исключение вызывается, если базовый метод (метод, называемый с помощью Reflection) выдает исключение.
Итак, если метод, который был вызван API отражения, генерирует исключение (например, исключение во время выполнения), API-интерфейс отражения превратит исключение в исключение InvocationTarget.
Ответ 11
У меня была та же проблема. Я использовал e.getCause(). GetCause(), тогда я обнаружил, что это из-за неправильных параметров, которые я проходил. Было исключение nullPointerException при получении значения одного из параметров.
Надеюсь, это поможет вам.
Ответ 12
- Перечислить все файлы jar из режима Eclipse Navigator
- Убедитесь, что все файлы jar находятся в двоичном режиме.
Ответ 13
Ошибка исчезла после того, как я сделал
Очистить- > Запустить xDoclet- > Запустить xPackaging.
В моей рабочей области, в ecllipse.