InvocationTargetException

本文介绍如何正确处理Java中的InvocationTargetException,并提供了一个示例方法来展示如何获取并显示被包装的异常消息。

InvocationTargetException是一种包装由调用方法或构造方法所抛出异常的受查异常。这个异常并不是Eclipse插件开发特有的,而是标准JDK中的,它定义在 java.lang.reflect包下。在进行Java开发的时候很少会接触到这个异常,不过在进行Eclipse插件开发中则不同,很多API都声明抛出此类异常,因此必须对此异常进行处理。

   
例如,我们开发一个方法用来统一处理异常:
    private static voidhandleException(Exception e)
    {
       MessageDialog.openError(Activator.getDefault().getWorkbench()
               .getDisplay().getActiveShell(), "error", e.getMessage());
        e.printStackTrace();
    }

   
我们发现当传递来的参数eInvocationTargetException 的时候弹出的对话框中的消息是空的,查看InvocationTargetException 的源码得知InvocationTargetException 并没有覆盖getMessage方法,所以消息当然是空的了。我们需要调用InvocationTargetException getTargetException方法得到要被包装的异常,这个异常才是真正我们需要的异常。修改代码如下所示:
    private static voidhandleException(Exception e)
    {
        String msg = null;
        if (e instanceofInvocationTargetException)
        {
            Throwable targetEx =((InvocationTargetException) e)
                    .getTargetException();
            if (targetEx != null)
            {
                msg =targetEx.getMessage();
            }
        } else
        {
            msg = e.getMessage();
        }
       MessageDialog.openError(Activator.getDefault().getWorkbench()
               .getDisplay().getActiveShell(), "error", msg);
        e.printStackTrace();
    }

 

<think> 我们被要求解释InvocationTargetException,并在最后提出3-5个相关问题,且问题必须以“§§相关问题§§”开头,并紧接着列出问题。 注意:必须使用中文回答。 InvocationTargetExceptionJava中的一个异常类,它位于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、付费专栏及课程。

余额充值