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