赞
踩
在程序中想要作为一个提示信息,并且中断程序来抛出一个异常Exception,但是却抛出了java.lang.reflect.UndeclaredThrowableException这个异常。
(1)首先要了解编译期异常和运行时异常
(2)如果一个异常是检查型异常并且没有在动态代理的接口处声明,那么它将会被包装成UndeclaredThrowableException.
而我们定义的自定义异常,被定义成了检查型异常,导致被包装成了UndeclaredThrowableException
(1)接口中要声明了该异常,就可以正常抛出。
(2)当我们使用JDK动态代理的时候,可以捕获 method.invoke(target, args) 抛出的 InvocationTargetException 异常。
(3)改成运行时异常。
补充:
在spring提供的反射工具reflectUtils中,除了运行时异常可以直接抛出信息外,其余的异常将抛出UndeclaredThrowableException后才会抛出自定义的信息
//源码如下
public static void rethrowRuntimeException(Throwable ex){
if(ex instanceof RuntimeException){
throw (RuntimeException) ex;
}
if(ex instanceof Error){
throw(Error) ex;
}
}
可以看到,该方法只是判断了运行时异常和Error;并原样抛出;怎么理解这个方法的调用?原因很简单,InvocationTargetException是在method.invoke的时候抛出的,方法在执行的过程中,方法本身的执行可能抛出RuntimeException或者Error,其余方法本身抛出的Exception异常直接包装为UndeclaredThrowableException(RuntimeException)处理;
统一下来,可以这样理解,除了在反射执行过程中遇到的Error,其余所有的Exception,都被统一转成了RuntimeException;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。