1. 前言

在我们使用Java的反射API时,我们经常会遇到java.lang.reflect.InvocationTargetException异常,在本教程中,我们将通过一个简单的实例来了解它以及处理它。

2. 引发InvocationTargetException异常的原因

在我们使用反射API去调用一个方法或者构造函数时,此时如果被调用的方法或者构造函数抛出异常,反射API则会使用InvocationTargetException异常类来包裹住真正的异常。

下面我们来演示一下如何引发该异常,首先我们编写一个能够抛出异常的类(下面的代码抛出ArithmeticException异常):

public class InvocationTargetExample {

public int divideByZeroExample() {

return 1 / 0;

}

}

现在,我们在一个JUnit5单元测试中使用反射API来调用上面这个方法:

InvocationTargetExample targetExample = new InvocationTargetExample();

// 使用反射API调用divideByZeroExample方法。

Method method =

InvocationTargetExample.class.getMethod("divideByZeroExample");

// 断言成功

Exception exception =

assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));

在上面的代码中,我们使用一个断言来检测InvocationTargetException异常,该断言可以成功执行。由此可以判断:虽然divideByZeroExample方法抛出的异常是ArithmeticException,但是通过反射API调用抛出的异常却变为了InvocationTargetException。现在,我们可能会产生疑问,为什么反射API不直接抛出真正的异常?

反射API这样设计的目的是为了让程序员能够区分异常是反射API自身抛出的,还是被调用的方法中抛出。

3. 如何处理InvocationTargetException 异常?

由上可知,InvocationTargetException异常只是包装了被调用方法所抛出的异常,我们可以使用Throwable.getCause()方法来获取到真正的异常。

我们继续上面的例子:

assertEquals(ArithmeticException.class, exception.getCause().getClass());

这里,我们已经知道被调用的方法会抛出ArithmeticException异常,所以上面的断言可以通过。

所以,我们可以在获取到真正的异常后进一步的处理它,例如,重新抛出真正的异常。

4. 总结

在这片文章中,我们了解到反射API是如何处理异常的,我们还学会了如何确定引发InvocationTargetException异常的真正原因。

java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException相关推荐

  1. java invocationtarget,启动工程报java.lang.reflect.InvocationTargetException的解决详解

    今天下了一个工程,启动时报了下面这个错误 2009-11-26 17:18:12 org.apache.catalina.core.StandardHost start 信息: XML validat ...

  2. 错误java.lang.reflect_java.lang.reflect.InvocationTargetException

    java.lang.reflect.InvocationTargetException错误 java.lang.reflect.InvocationTargetException'>java.l ...

  3. java.lang.reflect.InvocationTargetException异常

    java.lang.reflect.InvocationTargetException异常 参考文章: (1)java.lang.reflect.InvocationTargetException异常 ...

  4. Weka java.lang.reflect.InvocationTargetException

    在用Weka导入数据的时候报 java.lang.reflect.InvocationTargetException 错误,Weka运行包没有给出详细的错误信息,无法查到. 直接调试Weka源码,发现 ...

  5. java.lang.reflect.InvocationTargetException 的惨痛教训

    记录发布webservice漏发内部类文件导致异常java.lang.reflect.InvocationTargetException 的惨痛教训 我的一个实现类中调用了一个内部类,在本地测试正常, ...

  6. soupui :java.lang.reflect.InvocationTargetException

    问题:soup模拟接口,返回错误.但是控制台也没日志. soupui :java.lang.reflect.InvocationTargetException 原因:环境少包或者程序 转载于:http ...

  7. Javafx 报错Exception in Application start method java.lang.reflect.InvocationTargetException

    Javafx 报错Exception in Application start method java.lang.reflect.InvocationTargetException 代码如下: imp ...

  8. org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException异常解决

    org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException异常解决 参考文章: (1)org. ...

  9. json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException

    json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 参考文章: (1)json数据转换异 ...

最新文章

  1. java报表工具FineReport常用函数的用法总结(数学和三角函数)
  2. malloc函数具体解释
  3. java/php/c#版rsa签名以及java验签实现--转
  4. 【JUC并发编程07】Callable接口
  5. css33d图片轮播_1.Web前端之CSS3中3D立方体以及3D轮播图
  6. 复工后,看看他们都是怎么上班的!
  7. 如何写一个vue指令directive
  8. c#之task与thread区别及其使用
  9. exists sql用法_彻底弄懂sql select各种查询用法
  10. SL项目创建失败_提示安装SDK
  11. 58 同城 iOS 客户端组件体积分析与统计实践
  12. linux --- TCPdump 工具
  13. 修改hosts文件无效?附解决办法
  14. Linux进程的管理与调度(二)-- Linux的命名空间详解
  15. 海康威视硬盘录像机怎么连接萤石云
  16. Linux安装网易云音乐
  17. 服务器上怎么安虚拟主机呀,上线虚拟主机产品步骤
  18. i3型3D打印机制作详解——Marlin固件中文介绍
  19. win10u盘被写保护怎么解除_win10系统U盘被写保护解除的操作方法
  20. 获取mac最高root权限登录系统

热门文章

  1. 老有人问你什么是Docker?把这篇干货文章甩给他!
  2. mybatis执行的核心步骤
  3. python中赋值,深拷贝,浅拷贝区别
  4. 正确注释@return让PHPstorm动态返回类
  5. 【转】ASIHTTPRequest开源类库进行http请求
  6. C#调用C和C++函数的一点区别
  7. Zabbix3.2邮件告警python脚本
  8. Unity3d读取XML配置文件
  9. Httpclient处理摘要认证
  10. SQL Server 索引和表体系结构(包含列索引)