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

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

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

Просто распакуйте причину в InvocationTargetException и вы перейдете к исходному.

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

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

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

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

Из Javadoc of Method.invoke ()

Выбрасывает: 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 (), теперь известно как причина и может быть доступно через метод Throwable.getCause (), а также вышеупомянутый «унаследованный метод».

Вы можете сравнить с исходным classом исключения с использованием метода 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, я увидел, что object logger был null (некоторые внешние константы должны были быть созданы в самом начале моего class ).

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

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

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

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

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

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

  • Как создать экземпляр из строки в C #?
  • Вызов методов с необязательными параметрами посредством отражения
  • Насколько дорого стоит .NET-reflection?
  • Как вызвать метод Java, когда имя метода называется строкой?
  • Использование Case / Switch и GetType для определения объекта
  • Как я могу получить примитивное имя типа в C #?
  • Как проверить, является ли тип анонимным?
  • Загрузка DLL-файлов во время выполнения в C #
  • C ++ итерации во nested поле struct с boost fusion adapt_struct
  • Используя .Net, как я могу определить, является ли тип Numeric ValueType?
  • Изменение частных конечных полей посредством отражения
  • Interesting Posts

    Изменить имя / описание в контекстном меню Windows

    В чем отличия между VirtualAlloc и HeapAlloc?

    Селектор CSS для первого элемента с classом

    Разделить фрейм данных на несколько выходных файлов

    Как отправлять уведомления о блатной базе аудитории через HTTP

    Возможно ли / хорошая практика использовать один и тот же закрытый ключ для двух серверов для входа без пароля с одного и того же рабочего места / локального сервера?

    Как проверить, поддерживает ли мое оборудование 64-разрядную версию в Windows?

    Среднее время чтения одного сектора (диска)

    Понимание разницы между f () и f (void) в C и C ++ раз и навсегда

    Как проверить, является ли какое-либо значение NaN в Pandas DataFrame

    Слишком много папок в переменной пути

    Функция автозаполнения не требует правильного повторения чисел при использовании формулы AVERAGE () в Microsoft Excel

    Tmux: Как связать окно как разделенное окно?

    Как увеличить емкость консоли вывода Eclipse?

    Как получить Bitmap от Uri?

    Давайте будем гением компьютера.