Invocationtargetexception java что это
InvocationTargetException является проверенным исключением, которое обертывает исключение, выданное вызванным методом или конструктором. С выпуска 1.4 это исключение было retrofitted, чтобы соответствовать объединяющему в цепочку исключение механизму общего назначения. «Целевое исключение», которое обеспечивается во время создания и получается доступ через getTargetException() метод теперь известен как причина, и может быть получен доступ через Throwable.getCause() метод, так же как вышеупомянутый «метод наследства.»
Сводка конструктора
| Модификатор | Конструктор и Описание |
|---|---|
| protected | InvocationTargetException() |
Конструкции InvocationTargetException с null как целевое исключение.
Создает InvocationTargetException с целевым исключением.
Создает InvocationTargetException с целевым исключением и сообщением детали.
Сводка метода
| Модификатор и Тип | Метод и Описание |
|---|---|
| Throwable | getCause() |
Возвращает причину этого исключения (выданное целевое исключение, которое может быть null ).
Получите выданное целевое исключение.
Методы java.lang унаследованный от класса. Throwable
Методы java.lang унаследованный от класса. Объект
Деталь конструктора
InvocationTargetException
protected InvocationTargetException()
Конструкции InvocationTargetException с null как целевое исключение.
InvocationTargetException
public InvocationTargetException(Throwable target)
Создает InvocationTargetException с целевым исключением.
InvocationTargetException
public InvocationTargetException(Throwable target, String s)
Создает InvocationTargetException с целевым исключением и сообщением детали.
Деталь метода
getTargetException
public Throwable getTargetException()
Получите выданное целевое исключение. Этот метод предшествует средству объединения в цепочку исключения общего назначения. Throwable.getCause() метод является теперь привилегированными средствами получения этой информации.
getCause
public Throwable getCause()
Возвращает причину этого исключения (выданное целевое исключение, которое может быть null ).
Платформа Java™
Стандарт Эд. 7
Представьте ошибку или функцию
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE . Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Что вызывает java.lang.reflect.InvocationTargetException?
При работе с Java Reflection API часто встречается java.lang.reflect.InvocationTargetException .
В этом уроке мы рассмотрим это и как с этим справиться на простом примере .
2. Причина InvocationTargetException
В основном это происходит, когда мы работаем со слоем отражения и пытаемся вызвать метод или конструктор, который сам генерирует базовое исключение.
Слой отражения оборачивает фактическое исключение, созданное методом, с помощью InvocationTargetException .
Попробуем понять это на примере.
Мы напишем класс с методом, который намеренно выдает исключение:
public class InvocationTargetExample public int divideByZeroExample() return 1 / 0; > >
Давайте вызовем вышеуказанный метод, используя отражение в простом тесте JUnit 5:
InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));
В приведенном выше коде мы установили InvocationTargetException , которое возникает при вызове метода. Здесь важно отметить, что фактическое исключение — в данном случае ArithmeticException — заворачивается в InvocationTargetException .
Теперь, почему отражение не выдает фактическое исключение в первую очередь?
Причина в том, что это позволяет нам понять, произошло ли Исключение из-за сбоя при вызове метода через слой отражения или оно произошло внутри самого метода.
3. Как обрабатывать исключение InvocationTargetException ?
Здесь фактическое основное исключение является причиной InvocationTargetException , поэтому мы можем использовать Throwable.getCause() , чтобы получить больше информации об этом.
Давайте посмотрим, как мы можем использовать getCause() для получения фактического исключения в том же примере, что и выше:
assertEquals(ArithmeticException.class, exception.getCause().getClass());
Мы использовали метод getCause() для того же объекта исключения , который был сгенерирован. И мы заявили ArithmeticException.class как причину исключения.
Таким образом, как только мы получим базовое исключение, мы можем повторно сгенерировать его, обернуть его в какое-либо пользовательское исключение или просто зарегистрировать исключение в соответствии с нашим требованием.
4. Вывод
В этой короткой статье мы увидели, как слой отражения оборачивает любое базовое исключение.
Мы также увидели, как определить основную причину InvocationTargetException и как справиться с таким сценарием на простом примере.
Как обычно, код, использованный в этой статье, доступен на GitHub .
java.lang.reflect – исключения
Исключения java.lang.reflect содержат исключения, которые могут возникнуть во время операций отражения.
InvocationTargetException
InvocationTargetException – это проверенное исключение, которое переносит исключение, выброшенное вызванным методом или конструктором.
MalformedParameterizedTypeException
Брошенный, когда семантически искаженный параметризованный тип встречается рефлексивным методом, который должен создать его экземпляр.
UndeclaredThrowableException
Вызывается вызовом метода в экземпляре прокси, если метод invoke его обработчика вызова генерирует проверенное исключение (Throwable, которое нельзя назначить для RuntimeException или Error), которое нельзя назначить ни одному из типов исключений, объявленных в предложении throws метода, который был вызван на экземпляре прокси и отправлен обработчику вызова.
Как обработать исключение reflect.InvocationTargetException?
При попытке вызвать search при незаполненных полях EditText, программа вылетает с ошибкой Caused by: java.lang.reflect.InvocationTargetException . При попытке обработать эту ошибку в catch, студия пишет, что эту ошибку нельзя обработать в try-catch, поскольку она к ней не относится. Это, конечно, правильно, так и есть, но как же всё-таки можно её перехватить при незаполненных EditText и написать юзеру типа «поля то заполни!»? Вот для наглядности кусок кода:
public void search (View view)
Полный текст ошибки:
E/AndroidRuntime: FATAL EXCEPTION: main Process: ru.golgofa.wordfinder, PID: 26849 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390) at android.view.View.performClick(View.java:6294) at android.view.View$PerformClick.run(View.java:24770) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) at android.view.View.performClick(View.java:6294) at android.view.View$PerformClick.run(View.java:24770) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.NumberFormatException: For input string: "" at java.lang.Integer.parseInt(Integer.java:620) at java.lang.Integer.parseInt(Integer.java:643) at ru.golgofa.wordfinder.MainActivity.search(MainActivity.java:87)