Android error java lang reflect invocationtargetexception

Что вызывает java.lang.reflect.Исключение InvocationTargetException?

Узнайте, что вызывает java.lang.reflect.Исключение InvocationTargetException.

Автор: baeldung
Дата записи

1. Обзор

При работе с Java Reflection API часто встречается java.lang.reflect.InvocationTargetException . В этом уроке мы рассмотрим его и то, как с ним справиться, на простом примере .

2. Причина исключения InvocationTargetException

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

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

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

Теперь давайте вызовем описанный выше метод, используя отражение в простом тесте JUnit 5:

В приведенном выше коде мы утвердили исключение InvocationTargetException , которое возникает при вызове метода. Здесь важно отметить, что фактическое исключение – ArithmeticException в данном случае – оборачивается в InvocationTargetException.

Теперь вопрос, который приходит на ум, заключается в том, почему отражение не создает фактическое исключение в первую очередь?

Причина в том, что это позволяет нам понять, произошло ли Исключение из-за сбоя при вызове метода через слой отражения или оно произошло внутри самого метода.

3. Как обрабатывать исключение InvocationTargetException?

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

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

Здесь мы использовали метод getCause() для того же объекта exception , который был брошен. И мы утверждали ArithmeticException.class как причина исключения.

Таким образом, как только мы получим базовое исключение, мы можем перестроить его, обернуть в какое-то пользовательское исключение или просто зарегистрировать исключение в соответствии с нашими требованиями.

4. Заключение

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

Как обычно, код, используемый в этой статье, доступен на GitHub .

Источник

Java Exception Handling – InvocationTargetException

Moving along through our in-depth Java Exception Handling series, today we’ll take a closer look at the java.lang.reflect.InvocationTargetException. The java.lang.reflect.InvocationTargetException is thrown when working with the reflection API while attempting to invoke a method that throws an underlying exception itself.

In this article we’ll explore the InvocationTargetException in more detail by looking at where it resides in the Java Exception Hierarchy. We’ll also dig into a few functional reflection code samples that will illustrate how java.lang.reflect.InvocationTargetExceptions are typically thrown, showing how you might handle them in your own code, so let’s get crackin’!

The Technical Rundown

  • All Java errors implement the java.lang.Throwable interface, or are extended from another inherited class therein.
  • java.lang.Exception inherits from java.lang.Throwable .
  • java.lang.ReflectiveOperationException inherits from java.lang.Exception .
  • Finally, java.lang.reflect.InvocationTargetException inherits from java.lang.ReflectiveOperationException .

When Should You Use It?

Since the InvocationTargetException deals with reflection, let’s briefly talk a bit about that practice and why explicitly invoking a method via reflection might be useful. In the most basic sense, reflection allows the JVM and your underlying code to inspect classes, methods, interfaces, and the like during runtime, without having directly called or identified those objects during compilation. This powerful capability means that your code can find classes and invoke methods that it wasn’t originally designed to handle out of the box.

Читайте также:  Android клавиатура смена раскладки клавиатуры

To illustrate how invocation in Java works we have a few basic examples. To keep things simple, we’ll start with the full working code sample below, after which we’ll break it down in more detail to see what’s really going on:

As briefly mentioned in the introduction, an InvocationTargetException is automatically generated by reflection-related objects, and wraps (or attaches) itself to the underlying, actual exception type that caused the problem. This occurs when calling the java.lang.reflect.Method.invoke() method, where that invocation target method throws an exception.

To illustrate the issue we’ve got a basic Book class with a few property getter/setter methods, along with a some extraneous methods ( getTagline() and throwException() ) that we’ll explicitly call in the rest of our code:

The invokeGetTaglineMethod() method shows a basic, working example of using Java reflection to invoke() a class instance method ( Book.getTagline() , in this case).

The comments explain most everything that we’re doing, but the basic idea is that we starting by creating a Book instance object of book . We then need to instantiate a Class object, so we get a reflection of io.airbrake.Book , from which we can retrieve the declared getTagline() method. Using that Method instance of getTagline() we’re able to invoke() the method. Since this is an instance method, we need to pass an instance of the object as the first argument, so this is where we use the book object that was created at the beginning.

Executing this code results in the book object output, followed by the output from calling getTagline.invoke(book) , as expected:

Now that we’ve seen how invocation works, let’s try invoking a different Book instance method, specifically the Book.throwException() method. As its name suggests, Book.throwException() merely throws an Exception , using the passed String argument for the message:

To test this we’ll execute the invokeThrowExceptionMethod() method, which performs almost exactly the same code as our previous example, except the calls to getDeclaredMethod() and invoke() differ slightly since we’re also passing arguments to the invoked method:

Since the Book.throwException() method we’re invoking explicitly throws an error, our expectation is that executing the above code will result in a java.lang.reflect.InvocationTargetException being thrown. Sure enough, that’s exactly what happens:

Normally we’d only catch the parent InvocationTargetException in this scenario, which indicates the it was «Caused by: java.lang.Exception . » . However, a Throwable object implements the getCause() method, which returns the causal exception (if applicable). In the case of a InvocationTargetException instance, the cause is always the underlying exception object that occurred inside the invoked method, so checking for a cause when catching such exceptions is a good idea.

The Airbrake-Java library provides real-time error monitoring and automatic exception reporting for all your Java-based projects. Tight integration with Airbrake’s state of the art web dashboard ensures that Airbrake-Java gives you round-the-clock status updates on your application’s health and error rates. Airbrake-Java easily integrates with all the latest Java frameworks and platforms like Spring , Maven , log4j , Struts , Kotlin , Grails , Groovy , and many more. Plus, Airbrake-Java allows you to easily customize exception parameters and gives you full, configurable filter capabilities so you only gather the errors that matter most.

Читайте также:  Стандартные живые обои android

Check out all the amazing features Airbrake-Java has to offer and see for yourself why so many of the world’s best engineering teams are using Airbrake to revolutionize their exception handling practices! Try Airbrake free for 30 days.

Monitor Your App Free for 30 Days

Discover the power of Airbrake by starting a free 30-day trial of Airbrake. Quick sign-up, no credit card required. Get started.

Источник

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

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

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

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

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

13 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Лостфильм для смарт тв андроид

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

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

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

Источник

Исправление: Ошибка Java.lang.reflect.InvocationTargetException при использовании командный обозреватель везде 2010 SP1 для Eclipse для сохранения или просмотр рабочего элемента

Проблемы

Рассмотрим следующий сценарий.

На компьютере установить следующее программное обеспечение:

Eclipse 3.5 Eclipse 3.6 или продукта, который основан на одной из этих версий.

Командный обозреватель Microsoft Visual Studio везде 2010 Пакет обновления 1 (SP1) для Eclipse

Windows Internet Explorer 9

Командный обозреватель везде 2010 используйте для подключения к серверу Microsoft Team Foundation Server (TFS).

При попытке сохранить или просмотреть рабочий элемент, содержащий несколько элементов управления HTML.

В этом случае, сохранить или просмотреть завершится неудачно. Кроме того, появляется приведенное ниже сообщение об ошибке:

Причина

Эта проблема возникает из-за изменения в механизме JavaScript, появившееся в Internet Explorer 9. Изменение конфликтует вызывающего кода в уязвимых версиях Eclipse. Этот конфликт приводит к failaure функции для рабочего элемента, содержащий заполнены в командный обозреватель везде 2010 с пакетом обновления 1 элемент управления текстом в формате RTF. Таким образом сообщение об ошибке всплывает.

Решение

Сведения об исправлении

Исправление доступно для загрузки на следующий веб-узел центра загрузки корпорации Майкрософт: загрузить исправление. Дополнительные сведения о том, как загрузить файлы поддержки Майкрософт щелкните следующий номер статьи базы знаний Майкрософт:

119591 Как загрузить файлы технической поддержки Майкрософт через веб-службы Этот файл был проверен корпорацией Майкрософт на наличие вирусов. Корпорация Майкрософт использует самые последние на момент публикации файла версии антивирусного программного обеспечения. Файл хранится на защищенных серверах, что предотвращает его несанкционированное изменение. Примечание. Чтобы установить данное исправление, выполните следующие действия.

Сохраните файл Tfseclipseplugin-updatesitearchive-10.1.0-qfe1.zip пакета исправлений в локальной папке.

В меню Справка выберите пункт Установки нового программного обеспечения.

Нажмите кнопку Добавить.

В поле имя введите подключаемый модуль архивации локальной командный обозреватель и нажмите кнопку Архивировать.

Выберите файл Tfseclipseplugin-updatesitearchive-10.1.0-qfe1.zip, который был сохранен в локальной папке и нажмите кнопку ОК.

В диалоговом окне установки выберите установите флажок, соответствующий командный обозреватель везде в списке функций.

Два раза нажмите кнопку Далее .

Принять условия лицензионного соглашения на использование программного обеспечения корпорации Майкрософт, а затем нажмите кнопку Далее.

Нажмите кнопку Завершить.

Дополнительные сведения об установке подключаемого модуля Team Foundation Server и клиентом командной строки загрузить и просмотреть веб-страницу Майкрософт:

Предварительные условия

Для установки этого исправления необходимо иметь Microsoft Visual Studio командный обозреватель везде 2010 на компьютере установлен Пакет обновления 1 (SP1).

Необходимость перезагрузки

После установки этого исправления необходимо перезапустить Eclipse.

Сведения о замене исправлений

Это исправление не заменяет ранее выпущенные исправления.

Сведения о файлах

Глобальная версия этого исправления содержит атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для файлов указаны в формате UTC. При просмотре сведений о файлах выполняется перевод соответствующих значений в местное время. Чтобы узнать разницу между временем UTC и местным временем, откройте вкладку Часовой пояс элемента Дата и время панели управления.

Источник

Оцените статью