InvocationTargetException

本文介绍InvocationTargetException的处理方法,包括如何获取其内部的真实异常,并提供ApacheRanger源码示例。
InvocationTargetException 是一种包装由调用方法或构造方法所抛出异常的受查异常。这个异常并不是Eclipse插件开发特有的,而是标准JDK中的,它定义在 java.lang.reflect包下。在进行Java开发的时候很少会接触到这个异常,不过在进行Eclipse插件开发中则不同,很多API都声明抛出此类异常,因此必须对此异常进行处理。
但是InvocationTargetException太过于宽泛,在trouble shouting的时候,不能给人非常直观的信息,所以在处理反射方法异常的时候,我们需要把这个InvocationTargetException的targetException提取处理,重新抛出,因为这个才是对我们分析程序bug真正有帮助的异常:
一般情况下我们会调用e.getMessage()或者e.printStackTrace();查看错误,但是通过查看InvocationTargetException的源码得InvocationTargetException 并没有覆盖getMessage方法,所以消息当然是空的了。我们需要调用InvocationTargetException 的getTargetException方法得到要被包装的异常,这个异常才是真正我们需要的异常。
Apache Ranger的源码中是如下处理的:
try {
								m.invoke(null, master) ;
								logInfo("Execute method name [" + mname + "] in Class [" +  cName + "] is successful.");
							} catch (InvocationTargetException e) {
								Throwable cause = e ;
								boolean tableExistsExceptionFound = false ;
								if  (e != null) { 	
									Throwable ecause = e.getTargetException() ;
									if (ecause != null) {
										cause = ecause ;
										if (ecause instanceof TableExistsException) {
											tableExistsExceptionFound = true ;
										}
									}
								}



<think> 我们被要求解释InvocationTargetException,并在最后提出3-5个相关问题,且问题必须以“§§相关问题§§”开头,并紧接着列出问题。 注意:必须使用中文回答。 InvocationTargetException是Java中的一个异常类,它位于java.lang.reflect包中。当通过反射调用方法或构造函数时,如果被调用的方法或构造函数本身抛出了异常,那么该异常会被包装在InvocationTargetException中抛出。也就是说,InvocationTargetException是一个包装异常,它的getTargetException()或getCause()方法可以获取到原始异常。 例如: Method method = ...; try { method.invoke(obj, args); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); // 获取被包装的实际异常 // 处理实际异常 } 通常,我们在使用反射调用方法时,需要捕获这个异常,然后通过它来获得真正的异常原因。 现在,根据规则,在回答之后必须提出3-5个相关问题,并以“§§相关问题§§”开头,然后紧接着列出问题。 相关问题可以围绕: 1. InvocationTargetException与其他异常的区别? 2. 如何处理InvocationTargetException? 3. 在哪些常见场景下会遇到InvocationTargetException? 4. 如何避免InvocationTargetException? 5. 它的继承关系是怎样的? 注意:问题用阿拉伯数字序号,每个问题单独一行,但整个“§§相关问题§§”部分不能换行分散(即问题之间换行,但整个部分前面不能有空行,后面也不能有,且问题必须连续输出)。 因此,我们这样输出: §§相关问题§§ 1. InvocationTargetException和ReflectiveOperationException之间有什么关系? 2. 如何从InvocationTargetException中获取原始异常? 3. 在反射调用方法时,除了InvocationTargetException还可能抛出哪些异常? 4. 为什么Java反射机制要设计InvocationTargetException来包装原始异常? 5. 如何处理在反射调用中由构造函数抛出的异常? </think> ### 回答 `InvocationTargetException` 是 Java 反射机制中的一种异常,属于 `java.lang.reflect` 包。它发生在通过反射调用方法或构造函数时,**被调用的目标方法自身抛出了异常**。该异常的核心作用是包装原始异常(即目标方法内部的实际异常),开发者可通过 `getCause()` 或 `getTargetException()` 获取原始异常信息。 **关键特性**: 1. **包装机制**:作为“异常包装器”,隐藏反射调用的复杂性,暴露目标方法的真实异常。 2. **常见场景**:常见于 `Method.invoke()`、`Constructor.newInstance()` 等反射操作中。 3. **处理方式**: ```java try { method.invoke(object, args); } catch (InvocationTargetException e) { Throwable realException = e.getCause(); // 获取原始异常 // 处理真实异常 } ``` **示例**: 若反射调用 `methodA()` 时其内部抛出 `NullPointerException`,则反射代码会捕获到 `InvocationTargetException`,其中 `e.getCause()` 返回该 `NullPointerException`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值