InvocationTargetException异常处理

在最近一段时间的工作中,积累了几点异常处理的经验,怕时间久了就淡忘了,因此写下本文记录下来,一遍日后总结和查看。

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

 

Java代码 复制代码  收藏代码28095722_OU93.gif
  1. public Object invoke(Object obj, Object... args)   
  2. ows <SPAN style="COLOR: #ff0000">IllegalAccessException</SPAN>, IllegalArgumentException,   
  3.        InvocationTargetException   
  4. {   
  5.    ...........此处省略.....   
  6. }  
public Object invoke(Object obj, Object... args)
	throws IllegalAccessException, IllegalArgumentException,
           InvocationTargetException
    {
       ...........此处省略.....
    }

 

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

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

 

Java代码 复制代码  收藏代码28095722_OU93.gif
  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.     }   
  24. }  
public class InvokeException {
	
	@SuppressWarnings("null")
	public void testException(){
		String nullString = null;
		nullString.toString();
	}

	public static void main(String[] args) throws Throwable {
		// TODO Auto-generated method stub

		try{
			InvokeException invokeException = new InvokeException();
			Method method = invokeException.getClass().getMethod("testException");
			method.invoke(invokeException);
		}catch (Exception e) {
			if(e instanceof InvocationTargetException){
				throw ((InvocationTargetException) e).getTargetException();
			}else{
				//doXXX()
			}
		}
	}
}
 

下一篇讲介绍如何利用Spring的aop来把程序中的check exception转化成自定义的uncheck exception.

转载于:https://my.oschina.net/u/729507/blog/133865

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值