Java에서 java.lang.reflect.InvocationTargetException 오류 이해

Suraj P 2023년10월12일
  1. Java의 java.lang.reflect.InvocationTargetException 오류
  2. java.lang.reflect.InvocationTargetException 오류의 원인
  3. Java에서 java.lang.reflect.InvocationTargetException 오류 수정
  4. 결론
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으로 작업할 때 기본 예외를 얻는 방법과 이를 해결하는 방법을 이해했습니다.

작가: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

관련 문장 - Java Error