Xml java lang reflect invocationtargetexception

Исключение java.lang.reflect.InvocationTargetException в Java

Java.lang.reflect.InvocationTargetException является оберткой для исключения, которое было вызвано вызванным методом. Если вызванный метод в свою очередь вызывает другой метод, и этот второй метод вызывает исключение, это исключение будет «завернуто» в InvocationTargetException.

Пример

public class Test < public void testMethod() < throw new RuntimeException("Test"); >> public class Main < public static void main(String[] args) throws Exception < Test test = new Test(); Method method = Test.class.getMethod("testMethod"); try < method.invoke(test); >catch (InvocationTargetException e) < throw e.getCause(); >> >

В данном примере вызов method.invoke(test); вызывает исключение RuntimeException(«Test») , которое исходит из метода testMethod() . Это исключение затем «заворачивается» в InvocationTargetException .

Причины и решение

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

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

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

try < method.invoke(object, args); >catch (InvocationTargetException e) < Throwable cause = e.getCause(); // обрабатываем исключение cause >

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

Читайте также:  Open sans condensed css

Источник

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

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

1. Обзор

При работе с 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() для того же объекта exception , который был брошен. И мы утверждали ArithmeticException.class как причина исключения.

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

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

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

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

Читайте ещё по теме:

Источник

java.lang.reflect.invocationtargetexception

In this article, we will understand the meaning of the java.lang.reflect.invocationtargetexception, and why this exception is thrown.

Programs that need to be able to observe or alter the behavior of applications running inside the Java virtual machine frequently employ reflection. Developers with a firm command of the language’s foundations should be the only ones to use this feature because it is a relatively complex one. With that limitation in mind, a reflection is a strong tool that allows applications to execute tasks that would otherwise be impractical.

By establishing instances of extension objects with their fully qualified names, an application can utilize external, user-defined classes. Using the type of information provided by reflection in visual development environments can help developers write better code. Debuggers must be able to inspect private class members.

2. InvocationTargetException

This class extends ReflectiveOperationException, which is the common superclass of exceptions thrown by reflective operations in core reflection. InvocationTargetException is a checked exception that wraps an exception thrown by an invoked method or constructor.

Let us now create an example for it. We will create a very simple Application class with one method divide() . This method will take two parameters and will divide the first parameter by the second one:

public int divide (Integer a, Integer b) < return a/b; >

Now in the main method, we will get the method object from the getMethod() :

final Method method = Application.class.getMethod("divide", Integer.class, Integer.class);

Now invoke the method passing the parameters. Call the method with the second parameter as zero. This will result in ArithmeticException .

try < method.invoke(application, 1, 0); >catch (InvocationTargetException e)

package org.javacodegeeks; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Application < public int divide (Integer a, Integer b) < return a/b; >public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException < Application application = new Application(); final Method method = Application.class.getMethod("divide", Integer.class, Integer.class); try < method.invoke(application, 1, 0); >catch (InvocationTargetException e) < e.printStackTrace(); >> >

When you run the above class you will see an error as below. The division by zero will result in ArithmeticException which will be consumed by InvocationTargetException :

Fig. 1: java.lang.reflect.invocationtargetexception.

If you want to know the actual cause of the exception when the InvocationTargetException is thrown then you can get the cause from the InvocationTargetException object.

try < method.invoke(application, 1, 0); >catch (InvocationTargetException e)

Below is the output you will see:

Fig. 2: java.lang.reflect.invocationtargetexception.

3. Conclusion

In this article, we learned about InvocationTargetException. First, we briefly discussed the Reflection API in Java. We discussed the case when InvocationTargetException can be thrown and we also discussed how we get the actual cause of the exception.

4. Download

This was an example displaying where Java InvocationTargetException gets thrown and how to handle it.

Download
You can download the full source code of this example here: java.lang.reflect.invocationtargetexception

Источник

java.lang.reflect.invocationtargetexception

In this article, we will understand the meaning of the java.lang.reflect.invocationtargetexception, and why this exception is thrown.

Programs that need to be able to observe or alter the behavior of applications running inside the Java virtual machine frequently employ reflection. Developers with a firm command of the language’s foundations should be the only ones to use this feature because it is a relatively complex one. With that limitation in mind, a reflection is a strong tool that allows applications to execute tasks that would otherwise be impractical.

By establishing instances of extension objects with their fully qualified names, an application can utilize external, user-defined classes. Using the type of information provided by reflection in visual development environments can help developers write better code. Debuggers must be able to inspect private class members.

2. InvocationTargetException

This class extends ReflectiveOperationException, which is the common superclass of exceptions thrown by reflective operations in core reflection. InvocationTargetException is a checked exception that wraps an exception thrown by an invoked method or constructor.

Let us now create an example for it. We will create a very simple Application class with one method divide() . This method will take two parameters and will divide the first parameter by the second one:

public int divide (Integer a, Integer b) < return a/b; >

Now in the main method, we will get the method object from the getMethod() :

final Method method = Application.class.getMethod("divide", Integer.class, Integer.class);

Now invoke the method passing the parameters. Call the method with the second parameter as zero. This will result in ArithmeticException .

try < method.invoke(application, 1, 0); >catch (InvocationTargetException e)

package org.javacodegeeks; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Application < public int divide (Integer a, Integer b) < return a/b; >public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException < Application application = new Application(); final Method method = Application.class.getMethod("divide", Integer.class, Integer.class); try < method.invoke(application, 1, 0); >catch (InvocationTargetException e) < e.printStackTrace(); >> >

When you run the above class you will see an error as below. The division by zero will result in ArithmeticException which will be consumed by InvocationTargetException :

Fig. 1: java.lang.reflect.invocationtargetexception.

If you want to know the actual cause of the exception when the InvocationTargetException is thrown then you can get the cause from the InvocationTargetException object.

try < method.invoke(application, 1, 0); >catch (InvocationTargetException e)

Below is the output you will see:

Fig. 2: java.lang.reflect.invocationtargetexception.

3. Conclusion

In this article, we learned about InvocationTargetException. First, we briefly discussed the Reflection API in Java. We discussed the case when InvocationTargetException can be thrown and we also discussed how we get the actual cause of the exception.

4. Download

This was an example displaying where Java InvocationTargetException gets thrown and how to handle it.

Download
You can download the full source code of this example here: java.lang.reflect.invocationtargetexception

Источник

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