Что может вызвать 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 и вы получите исходную.

Комментарии (14)

Исключение возникает, если

InvocationTargetException - если базовый метод выбрасывает исключение.

Таким образом, если метод, который был вызван с помощью API отражения, выбрасывает исключение (например, исключение времени выполнения), API отражения обернет исключение в InvocationTargetException.

Комментарии (1)

Используйте getCause (метод)наInvocationTargetException`, чтобы получить исходное исключение.

Комментарии (0)

Из Javadoc метода Method.invoke()

Бросает: InvocationTargetException - если базовый метод выбрасывает исключение.

Это исключение выбрасывается, если вызванный метод выбросил исключение.

Комментарии (2)

Что InvocationTargetException-это, наверное, заканчивали свой ArrayIndexOutOfBoundsException. Никто не знает заранее, когда с помощью отражения, что метод может бросить -- так, а не используя подход бросает исключение, все исключения ловятся и завернутый в InvocationTargetException`.

Комментарии (1)

Это будет печатать точные строки кода в отдельный метод, который при вызове, поднял исключение:

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}
Комментарии (1)

Это описывает что-то вроде:

InvocationTargetException-это проверенное исключение, которое оборачивается исключение вызываемый метод или конструктор. Начиная с версии 1.4, это исключение было retrofitted, чтобы соответствовать исключения-цепочки механизму общего назначения. В "цель исключения", что это обеспечен во время и доступ через getTargetException() метод теперь известен как причина, и может быть доступ через Throwable.getCause() метод, а также вышеупомянутая "и устаревший метод.&и"

Комментарии (0)

Можно сравнить с оригиналом исключения, используя класс getCause() метод такой :

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 
Комментарии (0)

У меня был Ява.яз.отразить.Ошибка InvocationTargetException с заявлением, в котором призвали объект логгера во внешнемклассвпопробоватьблокпойматьв моейкласс`.

Пошаговое выполнение кода в отладчике &амп затмение; при наведении курсора мыши на утверждение регистратора я видел объект логгера было `нуль` (какие-то внешние константы должны быть инстанцирован в самом верху класса моя).

Комментарии (0)

Это исключение выдается, если основной метод(так называемый метод с помощью рефлексии) бросает исключение.

Поэтому, если метод, который был вызван API рефлексии, вызывает исключение (как, например, исключение на этапе выполнения), отражение API будет обернуть исключение в InvocationTargetException.

Комментарии (0)

Я столкнулся с той же проблемой. Я использовал е.getCause().getCause() потом я нашел, что это было из-за неправильных параметров, которые я проходил. Там был NullPointerException в выборке значение одного из параметров. Надеюсь, что это поможет вам.

Комментарии (0)
  1. Список все JAR-файлы из режима Затмение навигатор
  2. Убедитесь, что все JAR-файлы в бинарном режиме
Комментарии (2)

Ошибка исчезла после того как я сделал Чистые>запустить xdoclet все-и GT;запустить xPackaging.

В моей рабочей области, в ecllipse.

Комментарии (0)