java.lang.reflect.InvocationTargetException의 원인은 무엇입니까?

1. 개요

Java Reflection API로 작업 할 때 java.lang.reflect.InvocationTargetException 이 발생하는 것이 일반적 입니다. 이 튜토리얼에서는 간단한 예제를 통해이를 살펴보고 처리하는 방법을 살펴 보겠습니다 .

2. InvocationTargetException의 원인

주로 리플렉션 레이어로 작업하고 기본 예외 자체를 발생시키는 메서드 나 생성자를 호출하려고 할 때 발생합니다.

리플렉션 레이어는 InvocationTargetException을 사용하여 메서드에 의해 throw 된 실제 예외를 래핑합니다 . 예를 들어 이해하려고 노력합시다.

의도적으로 예외를 발생시키는 메서드가있는 클래스를 작성해 보겠습니다.

public class InvocationTargetExample { public int divideByZeroExample() { return 1 / 0; } }

이제 Simple JUnit 5 Test에서 리플렉션을 사용하여 위의 메서드를 호출 해 보겠습니다.

InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));

위의 코드에서 우리는 메서드를 호출하는 동안 발생하는 InvocationTargetException 을 주장했습니다 . 여기서 주목해야 할 중요한 점은 실제 예외 ( 이 경우 ArithmeticException)InvocationTargetException으로 래핑 된다는 것 입니다.

이제 떠오르는 질문은 왜 리플렉션이 처음에 실제 예외를 던지지 않는가?입니다.

그 이유는 리플렉션 레이어를 통한 메서드 호출 실패로 Exception이 발생했는지 아니면 메서드 자체 내에서 발생했는지 알 수 있기 때문입니다.

3. InvocationTargetException 을 처리하는 방법 ?

여기에 실제 기본 예외의 원인이 있는 InvocationTargetException 우리가 할 수 있도록, 사용 에 Throwable.getCause ()를 그것에 대해 더 많은 정보를 얻을 수 있습니다.

위에서 사용한 동일한 예제에서 getCause () 를 사용 하여 실제 예외를 얻는 방법을 살펴 보겠습니다 .

assertEquals(ArithmeticException.class, exception.getCause().getClass());

여기에서는 throw 된 동일한 예외 객체 에 getCause () 메서드를 사용했습니다 . 그리고 예외의 원인으로 ArithmeticException.class 를 주장했습니다 .

따라서 기본 예외가 발생하면 동일한 예외를 다시 던지거나 사용자 지정 예외로 래핑하거나 요구 사항에 따라 예외를 기록 할 수 있습니다.

4. 결론

이 짧은 기사에서 리플렉션 레이어가 기본 예외를 래핑하는 방법을 살펴 보았습니다. 또한 InvocationTargetException 의 근본 원인을 확인하는 방법과 간단한 예제를 통해 이러한 시나리오를 처리 하는 방법도 살펴 보았습니다 .

평소처럼이 기사에서 사용 된 코드는 GitHub에서 사용할 수 있습니다.