InvocationTargetException異常處理

在最近一段時間的工做中,積累了幾點異常處理的經驗,怕時間久了就淡忘了,所以寫下本文記錄下來,一遍往後總結和查看。

1.在經過反射執行方法的時,如Method.invoke(),若是被反射執行的方法體拋出了Exception,這個異常會被包裝成InvocationTargetException從新拋出,下面是jdk裏面的源碼: java

 

Java代碼 複製代碼  收藏代碼
  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。 spa

可是InvocationTargetException太過於寬泛,在trouble shouting的時候,不能給人很是直觀的信息,因此在處理反射方法異常的時候,咱們須要把這個InvocationTargetException的targetException提取處理,從新拋出,由於這個纔是對咱們分析程序bug真正有幫助的異常: code

 

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.     }   
  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. blog

相關文章
相關標籤/搜索