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 は主に、開発者がリフレクション レイヤーを使用してコンストラクターまたは基になる例外自体をスローするメソッドを呼び出そうとしたときに発生します。 したがって、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 であり、ゼロで割っているため発生します。

根本的な例外を修正すると、InvocationTargetException も解決されます。 以下は、例外のない完全な作業コードです。 ゼロ除算の部分を削除しただけです。

完全なソース コード:

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