目前,我正在创建一个库,负责处理项目中的异常。该库已导入到主项目中,并且除了定义的几种自定义错误类型之外,还具有 GlobalExceptionHandler。
在代码的某个部分我有:
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@Resource
private MessageSource messageSource;
@ExceptionHandler(Exception.class)
private ResponseEntity<Object> handleGeneral(Exception e, WebRequest request) {
String message = "";
if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) {
我设法抛出一个异常,它被全局处理程序捕获,但是当它到达这个 IF 时
e.getClass().isAssignableFrom(UndeclaredThrowableException.class)
,出现以下错误:
java.lang.ClassCastException: class java.lang.Exception cannot be cast to class java.lang.reflect.UndeclaredThrowableException (java.lang.Exception and java.lang.reflect.UndeclaredThrowableException are in module java.base of loader 'bootstrap')
有人可以帮助我吗?当直接在项目中进行异常处理时,这段代码可以正常工作。我不知道如何继续。
注意:
e.getClass().isAssignableFrom(UndeclaredThrowableException.class) == true
,根据intellij调试器,但根据我一直在研究的内容,isAssignableFrom尝试执行强制转换,然后出现错误。
我已经尝试过调试项目并在其他情况下研究此错误,但我没有找到任何对我有帮助的东西。
您的代码不完整。根据您发布的内容,我们只能假设当条件为
e
时,您正在 UndeclaredThrowableException
语句中执行从 if
到 true
的类型转换。
在这种情况下,你就搞反了。要测试
e
是否可以分配给 UndeclaredThrowableException
类型的变量,您必须使用
if(UndeclaredThrowableException.class.isAssignableFrom(e.getClass())) {
UndeclaredThrowableException u = (UndeclaredThrowableException)e;
…
}
当您从
u
分配 e
时。但这是不必要的复杂。就写吧
if(e instanceof UndeclaredThrowableException) {
UndeclaredThrowableException u = (UndeclaredThrowableException)e;
…
}
而且不可能混淆这些论点。
从 Java 16 开始,您可以进一步简化它
if(e instanceof UndeclaredThrowableException u) {
// use u
…
}
甚至没有可能失败的类型转换。