Что может вызвать java.lang.reflect.InvocationTargetException? - PullRequest
286 голосов
/ 16 мая 2011

Ну, я пытался понять и прочитать, что могло вызвать это, но я просто не могу понять:

У меня есть это где-то в моем коде:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

Дело в том, что когда он пытается вызвать какой-то метод, он бросает InvocationTargetException вместо какого-то другого ожидаемого исключения (в частности, ArrayIndexOutOfBoundsException). Поскольку я действительно знаю, какой метод вызывается, я сразу перешел к коду этого метода и добавил блок try-catch для строки, в которой предполагается выбросить ArrayIndexOutOfBoundsException, и он действительно выдал ArrayIndexOutOfBoundsException, как ожидалось. Все же, когда идет вверх как-то меняется на InvocationTargetException и в коде выше catch(Exception e) е InvocationTargetException а не ArrayIndexOutOfBoundsException как и ожидалось.

Что может вызвать такое поведение или как я могу проверить такую ​​вещь?

Ответы [ 13 ]

305 голосов
/ 16 мая 2011

Вы добавили дополнительный уровень абстракции, вызвав метод с отражением.Слой отражения оборачивает любое исключение в InvocationTargetException, что позволяет определить разницу между исключением на самом деле , вызванным сбоем в вызове отражения (например, ваш список аргументов был недопустим) иошибка в методе.

Просто разверните причину в InvocationTargetException, и вы получите исходную.

43 голосов
/ 30 июня 2012

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

43 голосов
/ 16 мая 2011

Исключение выдается, если

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

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

20 голосов
/ 16 мая 2011

Из Javadoc Method.invoke ()

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

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

9 голосов
/ 23 декабря 2014

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

try {

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

} catch (InvocationTargetException e) {

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

    // generic exception handling
    e.printStackTrace();
}
9 голосов
/ 16 мая 2011

То, что InvocationTargetException, вероятно, окутывает ваше ArrayIndexOutOfBoundsException. При использовании рефлексии невозможно предсказать, что может дать этот метод, поэтому вместо использования throws Exception все исключения перехватываются и заключаются в InvocationTargetException.

3 голосов
/ 11 декабря 2013

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

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

1 голос
/ 14 декабря 2017

У меня была ошибка java.lang.reflect.InvocationTargetException из оператора, вызывающего объект регистратора во внешнем class внутри блока try / catch в моем class.

Пройдя по коду в отладчике Eclipse и наведя указатель мыши на оператор logger, я увидел, что logger object был null (некоторые внешние константы нужно было создать в самой верхней части моего class).

1 голос
/ 09 ноября 2016

Вы можете сравнить с исходным классом исключений, используя метод 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 голосов
/ 17 июня 2017

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

...