java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
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相关推荐
- java invocationtarget,启动工程报java.lang.reflect.InvocationTargetException的解决详解
今天下了一个工程,启动时报了下面这个错误 2009-11-26 17:18:12 org.apache.catalina.core.StandardHost start 信息: XML validat ...
- 错误java.lang.reflect_java.lang.reflect.InvocationTargetException
java.lang.reflect.InvocationTargetException错误 java.lang.reflect.InvocationTargetException'>java.l ...
- java.lang.reflect.InvocationTargetException异常
java.lang.reflect.InvocationTargetException异常 参考文章: (1)java.lang.reflect.InvocationTargetException异常 ...
- Weka java.lang.reflect.InvocationTargetException
在用Weka导入数据的时候报 java.lang.reflect.InvocationTargetException 错误,Weka运行包没有给出详细的错误信息,无法查到. 直接调试Weka源码,发现 ...
- java.lang.reflect.InvocationTargetException 的惨痛教训
记录发布webservice漏发内部类文件导致异常java.lang.reflect.InvocationTargetException 的惨痛教训 我的一个实现类中调用了一个内部类,在本地测试正常, ...
- soupui :java.lang.reflect.InvocationTargetException
问题:soup模拟接口,返回错误.但是控制台也没日志. soupui :java.lang.reflect.InvocationTargetException 原因:环境少包或者程序 转载于:http ...
- Javafx 报错Exception in Application start method java.lang.reflect.InvocationTargetException
Javafx 报错Exception in Application start method java.lang.reflect.InvocationTargetException 代码如下: imp ...
- org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException异常解决
org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException异常解决 参考文章: (1)org. ...
- json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 参考文章: (1)json数据转换异 ...
最新文章
- java报表工具FineReport常用函数的用法总结(数学和三角函数)
- malloc函数具体解释
- java/php/c#版rsa签名以及java验签实现--转
- 【JUC并发编程07】Callable接口
- css33d图片轮播_1.Web前端之CSS3中3D立方体以及3D轮播图
- 复工后,看看他们都是怎么上班的!
- 如何写一个vue指令directive
- c#之task与thread区别及其使用
- exists sql用法_彻底弄懂sql select各种查询用法
- SL项目创建失败_提示安装SDK
- 58 同城 iOS 客户端组件体积分析与统计实践
- linux --- TCPdump 工具
- 修改hosts文件无效?附解决办法
- Linux进程的管理与调度(二)-- Linux的命名空间详解
- 海康威视硬盘录像机怎么连接萤石云
- Linux安装网易云音乐
- 服务器上怎么安虚拟主机呀,上线虚拟主机产品步骤
- i3型3D打印机制作详解——Marlin固件中文介绍
- win10u盘被写保护怎么解除_win10系统U盘被写保护解除的操作方法
- 获取mac最高root权限登录系统