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
は主に、開発者がリフレクション レイヤーを使用してコンストラクターまたは基になる例外自体をスローするメソッドを呼び出そうとしたときに発生します。 したがって、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
を操作するときに根本的な例外を取得する方法と、それを解決する方法を理解しました。