首页 > 代码库 > Java Basic Exception
Java Basic Exception
异常处理经验小结之一:不要直接抛出InvocationTargetException (转http://olylakers.iteye.com/blog/1137371)
在最近一段时间的工作中,积累了几点异常处理的经验,怕时间久了就淡忘了,因此写下本文记录下来,一遍日后总结和查看。
1.在通过反射执行方法的时,如Method.invoke(),如果被反射执行的方法体抛出了Exception,这个异常会被包装成InvocationTargetException重新抛出,下面是jdk里面的源码:
public Object invoke(Object obj, Object... args) throws <span style="color: #ff0000;">IllegalAccessException</span>, IllegalArgumentException, InvocationTargetException { ...........此处省略..... }
比如反射方法里抛出了NullPointException,则Method.invoke方法抛出的是InvocationTargetException,而不是NullPointException,见下面的例子,此处抛出的就是InvocationTargetException。
但是InvocationTargetException太过于宽泛,在trouble shouting的时候,不能给人非常直观的信息,所以在处理反射方法异常的时候,我们需要把这个InvocationTargetException的targetException提取处理,重新抛出,因为这个才是对我们分析程序bug真正有帮助的异常:
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(); The Throwable.getCause() method is now the preferred means of obtaining this information. e.getCause() }else{ throw e; } } } }
Java Basic Exception
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。