一文深入理解Java中的java.lang.reflect.InvocationTargetException错误

 更新时间:2024年03月21日 09:06:52   作者:迹忆客  
这篇文章主要给大家介绍了关于Java中java.lang.reflect.InvocationTargetException错误的相关资料,java.lang.reflect.InvocationTargetException是Java中的一个异常类,它通常是由反射调用方法时抛出的异常,需要的朋友可以参考下

Java 中的 java.lang.reflect.InitationTargetException 错误

当开发人员使用 Java Reflection API 时,java.lang.reflect.InitationTargetException 是一个非常常见的异常。 检查的异常保存由调用的方法或构造函数抛出的异常。

从 JDK 1.4 版本开始,该异常已被改进以符合通用异常链机制。 简而言之,每当开发人员尝试使用 Method.invoke() 调用一个类时,我们都会收到 InvocableTargetException ,并且它被 java.lang.reflect.InvokeTargetException 包裹。

java.lang.reflect.InvocableTargetException错误的原因

IncationTargetException 主要发生在开发人员使用反射层并尝试调用本身引发底层异常的构造函数或方法时。 因此,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

修复 Java 中的 java.lang.reflect.InitationTargetException 错误

根据上面的内容,我们了解到底层异常是导致 java.lang.reflect.InitationTargetException 错误的原因。 我们可以使用 Throwable 类的 getCause() 方法获取有关底层异常的更多信息。

因此,解决 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,因为我们除以零而发生。

一旦我们修复了底层异常,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();
        }
    }
}

总结

在本文中,我们了解了在 Java 中使用反射层时如何包装底层异常。 我们了解了在使用 java.lang.reflect.InitationTargetException 时如何获取底层异常以及如何解决它。

到此这篇关于Java中java.lang.reflect.InvocationTargetException错误的文章就介绍到这了,更多相关java.lang.reflect.InvocationTargetException错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot加载启动的源码解析

    SpringBoot加载启动的源码解析

    这篇文章主要介绍了SpringBoot加载启动的源码解析,@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解,本身其实也是一个IoC容器的配置类,需要的朋友可以参考下
    2023-12-12
  • Java实现学生信息管理界面

    Java实现学生信息管理界面

    这篇文章主要为大家详细介绍了Java实现学生信息管理界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • java限流算法详细

    java限流算法详细

    这篇文章详细的介绍了java限流算法常用到的算法计数算法、漏桶算法、令牌桶等算法的相关资料,需要的朋友可以参考下文,希望本篇文章能帮助到您
    2021-09-09
  • java省市级联下拉菜单实例代码

    java省市级联下拉菜单实例代码

    这篇文章主要为大家详细介绍了java省市级联实例代码,具有一定的参考价值,感兴趣的朋友可以参考一下
    2016-05-05
  • java实现贪吃蛇小游戏

    java实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了java实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Java多线程之同步工具类Exchanger

    Java多线程之同步工具类Exchanger

    这篇文章主要介绍了Java多线程之同步工具类Exchanger,Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,下面来看看具体内容吧
    2021-10-10
  • java教程之java注解annotation使用方法

    java教程之java注解annotation使用方法

    这篇文章主要介绍了java注解annotation使用方法,注解可以定义到方法上,类上,一个注解相当与一个类,就相当于实例了一个对象,加上了注解,就相当于加了一个标志
    2014-01-01
  • java通过注解翻译字典的实现示例

    java通过注解翻译字典的实现示例

    本文主要介绍了java通过注解翻译字典的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java并发编程之阻塞队列深入详解

    Java并发编程之阻塞队列深入详解

    这篇文章主要介绍了详解Java阻塞队列(BlockingQueue)的实现原理,阻塞队列是Java util.concurrent包下重要的数据结构,是一种特殊的队列,需要的朋友可以参考下
    2021-10-10
  • maven导入本地仓库jar包,报:Could not find artifact的解决

    maven导入本地仓库jar包,报:Could not find artifact的解决

    这篇文章主要介绍了maven导入本地仓库jar包,报:Could not find artifact的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论