Java에서 java.lang.reflect.InvocationTargetException 오류 이해
-
Java의
java.lang.reflect.InvocationTargetException
오류 -
java.lang.reflect.InvocationTargetException
오류의 원인 -
Java에서
java.lang.reflect.InvocationTargetException
오류 수정 - 결론
이 기사에서는 Java의 java.lang.reflect.InvocationTargetException
에 대해 알아봅니다.
Java의 java.lang.reflect.InvocationTargetException
오류
java.lang.reflect.InvocationTargetException
은 개발자가 Java Reflection
API로 작업할 때마다 발생하는 매우 일반적인 예외입니다. checked
예외는 호출된 메소드 또는 생성자에 의해 발생한 예외를 보유합니다.
릴리스 JDK 1.4,
에서 이 예외는 범용 예외 체인 메커니즘을 준수하도록 개조되었습니다. 간단히 말해서 개발자가 Method.invoke()
를 사용하여 클래스를 호출하려고 할 때마다 InvocationTargetException
이 발생하고 java.lang.reflect.InvocationTargetException
으로 래핑됩니다.
java.lang.reflect.InvocationTargetException
오류의 원인
InvocationTargetException
은 주로 개발자가 리플렉션 레이어로 작업하고 기본 예외 자체를 throw하는 생성자 또는 메서드를 호출하려고 할 때 발생합니다. 따라서 Java reflection API
는 메소드에서 발생한 예외를 InvocationTargetException
으로 래핑합니다.
더 잘 이해할 수 있도록 코드 예제를 살펴보겠습니다.
예제 코드:
import java.lang.reflect.*;
public class Test {
public int divideByZero() {
return 89 / 0;
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException {
Test obj = new Test();
Method method = Test.class.getMethod("divideByZero");
try {
method.invoke(obj);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
출력:
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at Test.main(Test.java:13)
Caused by: java.lang.ArithmeticException: / by zero
at Test.divideByZero(Test.java:6)
... 5 more
Java에서 java.lang.reflect.InvocationTargetException
오류 수정
위의 내용을 바탕으로 java.lang.reflect.InvocationTargetException
오류의 원인이 근본적인 예외임을 이해했습니다. Throwable
클래스의 getCause ()
메서드를 사용하여 기본 예외에 대한 자세한 정보를 얻을 수 있습니다.
따라서 InvocationTargetException
을 해결하려면 기본 예외를 찾고 해결해야 합니다.
예제 코드:
import java.lang.reflect.*;
public class Test {
public int divideByZero() {
return 89 / 0;
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException {
Test obj = new Test();
Method method = Test.class.getMethod("divideByZero");
try {
method.invoke(obj);
} catch (InvocationTargetException e) {
System.out.println(e.getCause());
}
}
}
출력:
java.lang.ArithmeticException: / by zero
위 출력에서 실제 기본 예외는 ArithmeticException
이며 0으로 나누기 때문에 발생합니다.
기본 예외를 수정하면 InvocationTargetException
도 해결됩니다. 다음은 예외가 없는 전체 작업 코드입니다. 방금 0으로 나누는 부분을 제거했습니다.
완전한 소스 코드:
import java.lang.reflect.*;
public class Test {
public int divideByZero() {
return 89 / 9;
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException {
Test obj = new Test();
Method method = Test.class.getMethod("divideByZero");
try {
method.invoke(obj);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
결론
이 기사에서는 Java에서 리플렉션 레이어를 작업할 때 기본 예외가 래핑되는 방법을 배웠습니다. java.lang.reflect.InvocationTargetException
으로 작업할 때 기본 예외를 얻는 방법과 이를 해결하는 방법을 이해했습니다.