Что может вызвать 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.