Что может вызвать Java.ленг.отражать.InvocationTargetException?



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



у меня это где-то в мой код:



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


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



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

1401   13  

13 ответов:

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

просто разверните причину внутри InvocationTargetException и вы доберетесь до оригинала.

исключение, если

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

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

использовать getCause() метод InvocationTargetException для получения исходного исключения.

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

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

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

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

try {

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

} catch (InvocationTargetException e) {

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

    // generic exception handling
    e.printStackTrace();
}

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

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

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

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

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 

Я java.lang.reflect.InvocationTargetException ошибка из инструкции, вызывающей объект logger во внешнем class внутри try/catch заблокировать в моем class.

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

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

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

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

  1. Список всех файлов jar из режима Eclipse Navigator
  2. убедитесь, что все файлы jar находятся в двоичном режиме

ошибка исчезла после того как я сделал Очистить- > запустить xDoclet - >запустить xPackaging.

в моем рабочем пространстве, в ecllipse.

Comments

    Ничего не найдено.