包装过的异常--InvocationTargetException

本文探讨了使用Java反射机制调用方法时异常处理的最佳实践。当反射调用的方法内部抛出异常时,会以InvocationTargetException的形式被捕获。文章提供了具体的代码示例说明如何正确地获取并抛出原始异常,以便于更准确的问题定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在通过反射执行方法的时,如Method.invoke(),如果被反射执行的方法体抛出了Exception,这个异常会被包装成InvocationTargetException重新抛出,下面是jdk里面的源码:

 

Java代码  收藏代码
  1. public Object invoke(Object obj, Object... args)  
  2. ows <span style="color: #ff0000;">IllegalAccessException</span>, IllegalArgumentException,  
  3.        InvocationTargetException  
  4. {  
  5.    ...........此处省略.....  
  6. }  

 

  比如反射方法里抛出了NullPointException,则Method.invoke方法抛出的是InvocationTargetException,而不是NullPointException,见下面的例子,此处抛出的就是InvocationTargetException。

但是InvocationTargetException太过于宽泛,在trouble shouting的时候,不能给人非常直观的信息,所以在处理反射方法异常的时候,我们需要把这个InvocationTargetException的targetException提取处理,重新抛出,因为这个才是对我们分析程序bug真正有帮助的异常:

 

Java代码  收藏代码
  1. public class InvokeException {  
  2.       
  3.     @SuppressWarnings("null")  
  4.     public void testException(){  
  5.         String nullString = null;  
  6.         nullString.toString();  
  7.     }  
  8.   
  9.     public static void main(String[] args) throws Throwable {  
  10.         // TODO Auto-generated method stub  
  11.   
  12.         try{  
  13.             InvokeException invokeException = new InvokeException();  
  14.             Method method = invokeException.getClass().getMethod("testException");  
  15.             method.invoke(invokeException);  
  16.         }catch (Exception e) {  
  17.             if(e instanceof InvocationTargetException){  
  18.                 throw ((InvocationTargetException) e).getTargetException();  
  19.             }else{  
  20.                 //doXXX()  
  21.             }  
  22.         }  
  23.     }  

  1. }  

 结论: 在利用 Method 对象的 invoke 方法调用目标对象的方法时, 若在目标对象的方法内部抛出异常, 会抛出 InvocationTargetException 异常, 该异常包装了目标对象的方法内部抛出异常, 可以通过调用 InvocationTargetException 异常类的的 getTargetException() 方法得到原始的异常.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值