一文深入理解Java中的java.lang.reflect.InvocationTargetException錯(cuò)誤
Java 中的 java.lang.reflect.InitationTargetException 錯(cuò)誤
當(dāng)開發(fā)人員使用 Java Reflection API 時(shí),java.lang.reflect.InitationTargetException 是一個(gè)非常常見的異常。 檢查的異常保存由調(diào)用的方法或構(gòu)造函數(shù)拋出的異常。
從 JDK 1.4 版本開始,該異常已被改進(jìn)以符合通用異常鏈機(jī)制。 簡而言之,每當(dāng)開發(fā)人員嘗試使用 Method.invoke() 調(diào)用一個(gè)類時(shí),我們都會(huì)收到 InvocableTargetException ,并且它被 java.lang.reflect.InvokeTargetException 包裹。
java.lang.reflect.InvocableTargetException錯(cuò)誤的原因
IncationTargetException 主要發(fā)生在開發(fā)人員使用反射層并嘗試調(diào)用本身引發(fā)底層異常的構(gòu)造函數(shù)或方法時(shí)。 因此,Java 反射 API 將方法拋出的異常包裝為 InvoicationTargetException。
讓我們看一個(gè)代碼示例來更好地理解它。
示例代碼:
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
修復(fù) Java 中的 java.lang.reflect.InitationTargetException 錯(cuò)誤
根據(jù)上面的內(nèi)容,我們了解到底層異常是導(dǎo)致 java.lang.reflect.InitationTargetException 錯(cuò)誤的原因。 我們可以使用 Throwable 類的 getCause() 方法獲取有關(guān)底層異常的更多信息。
因此,解決 IncationTargetException 涉及查找并解決底層異常。
示例代碼:
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
在上面的輸出中,實(shí)際的底層異常是 ArithmeticException,因?yàn)槲覀兂粤愣l(fā)生。
一旦我們修復(fù)了底層異常,InitationTargetException 也得到了解決。 以下是完整的工作代碼,無一例外; 我們剛剛刪除了除以零的部分。
完整源代碼:
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();
}
}
}
總結(jié)
在本文中,我們了解了在 Java 中使用反射層時(shí)如何包裝底層異常。 我們了解了在使用 java.lang.reflect.InitationTargetException 時(shí)如何獲取底層異常以及如何解決它。
到此這篇關(guān)于Java中java.lang.reflect.InvocationTargetException錯(cuò)誤的文章就介紹到這了,更多相關(guān)java.lang.reflect.InvocationTargetException錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解使用JavaMailSender給曾經(jīng)心愛的她再中秋發(fā)送一封特別的郵件
網(wǎng)站的服務(wù)端向用戶發(fā)郵件時(shí),郵件中往往需要攜帶圖片,鏈接等內(nèi)容。所以為了方便起見,我們一般發(fā)送HTML格式的郵件,那么怎么去拼一個(gè)HTML格式的郵件呢?——Thymeleaf。開始之前,先新建一個(gè)SpringBoot項(xiàng)目,并添加需要用到的依賴。然后就可以繼續(xù)往下了2022-09-09
idea復(fù)制項(xiàng)目并重命名實(shí)現(xiàn)方式(項(xiàng)目另存為)
本文介紹了解決在Eclipse中復(fù)制項(xiàng)目時(shí)遇到的問題的方法,通過直接復(fù)制項(xiàng)目、刪除workspace.xml文件、修改iml文件以及重新打開項(xiàng)目,成功解決了問題,文章最后鼓勵(lì)讀者參考這些方法并給予支持2026-04-04
Springboot使用異步方法優(yōu)化Service邏輯,提高接口響應(yīng)速度方式
這篇文章主要介紹了Springboot使用異步方法優(yōu)化Service邏輯,提高接口響應(yīng)速度方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Spring Boot Feign服務(wù)調(diào)用之間帶token問題
這篇文章主要介紹了Spring Boot Feign服務(wù)調(diào)用之間帶token的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
java中判斷map<String,List>是否有key的四種方法
這篇文章主要為大家詳細(xì)介紹了java中判斷map<String,List>是否有key的四種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-12-12

