java.lang.ClassCastException:类 java.lang.Exception 无法转换为类 java.lang.reflect.UndeclaredThrowableException

问题描述 投票:0回答:1

目前,我正在创建一个库,负责处理项目中的异常。该库已导入到主项目中,并且除了定义的几种自定义错误类型之外,还具有 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尝试执行强制转换,然后出现错误。

我已经尝试过调试项目并在其他情况下研究此错误,但我没有找到任何对我有帮助的东西。

java
1个回答
0
投票

您的代码不完整。根据您发布的内容,我们只能假设当条件为

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
    …
}

甚至没有可能失败的类型转换。

© www.soinside.com 2019 - 2024. All rights reserved.