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