一文深入理解Java中的java.lang.reflect.InvocationTargetException錯誤
Java 中的 java.lang.reflect.InitationTargetException 錯誤
當(dāng)開發(fā)人員使用 Java Reflection API 時,java.lang.reflect.InitationTargetException
是一個非常常見的異常。 檢查的異常保存由調(diào)用的方法或構(gòu)造函數(shù)拋出的異常。
從 JDK 1.4 版本開始,該異常已被改進(jìn)以符合通用異常鏈機制。 簡而言之,每當(dāng)開發(fā)人員嘗試使用 Method.invoke()
調(diào)用一個類時,我們都會收到 InvocableTargetException ,并且它被 java.lang.reflect.InvokeTargetException
包裹。
java.lang.reflect.InvocableTargetException錯誤的原因
IncationTargetException 主要發(fā)生在開發(fā)人員使用反射層并嘗試調(diào)用本身引發(fā)底層異常的構(gòu)造函數(shù)或方法時。 因此,Java 反射 API 將方法拋出的異常包裝為 InvoicationTargetException。
讓我們看一個代碼示例來更好地理解它。
示例代碼:
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 錯誤
根據(jù)上面的內(nèi)容,我們了解到底層異常是導(dǎo)致 java.lang.reflect.InitationTargetException
錯誤的原因。 我們可以使用 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
在上面的輸出中,實際的底層異常是 ArithmeticException,因為我們除以零而發(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 中使用反射層時如何包裝底層異常。 我們了解了在使用 java.lang.reflect.InitationTargetException
時如何獲取底層異常以及如何解決它。
到此這篇關(guān)于Java中java.lang.reflect.InvocationTargetException錯誤的文章就介紹到這了,更多相關(guān)java.lang.reflect.InvocationTargetException錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis通用Mapper和PageHelper的過程詳解
這篇文章主要介紹了MyBatis通用Mapper和PageHelper的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11springboot批量接收對象參數(shù),接收List方式
在Spring Boot項目中,批量接收對象參數(shù)可以通過自定義對象和使用`@RequestBody`注解來實現(xiàn),首先,定義一個包含列表的自定義對象,然后在Controller中使用該對象接收前端傳遞的JSON數(shù)組,通過Postman模擬請求,可以成功批量接收并處理對象參數(shù)2025-02-02java中g(shù)radle項目報錯org.gradle?.api.plugins.MavenPlugin解決辦法
在使用Gradle時開發(fā)者可能會遇到org.gradle?.api.plugins.MavenPlugin報錯提醒,這篇文章主要給大家介紹了關(guān)于java中g(shù)radle項目報錯org.gradle?.api.plugins.MavenPlugin的解決辦法,需要的朋友可以參考下2023-12-12SpringBoot使用異步線程池實現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送
本文主要介紹了SpringBoot使用異步線程池實現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02Java StringBuilder和StringBuffer源碼分析
這篇文章主要針對Java中兩個常用的操作字符串的類 StringBuilder和StringBuffer進(jìn)行源碼分析,感興趣的小伙伴們可以參考一下2016-01-01Java中創(chuàng)建線程池的幾種方式以及區(qū)別
創(chuàng)建線程池有多種方式,主要通過 Java 的 java.util.concurrent 包提供的 Executors 工具類來實現(xiàn),本文給大家介紹了幾種常見的線程池類型及其區(qū)別,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-11-11