我有两个 RuntimeException,如下所示:
@Getter
@RequiredArgsConstructor
public class MyCustomRuntimeException1 extends RuntimeException {
private final String message;
private final int code;
}
@Getter
@RequiredArgsConstructor
public class MyCustomRuntimeException2 extends RuntimeException {
private final String message;
private final int code;
}
然后我有我的 doSomethingMethod,我在同一个 catch 子句中捕获它们:
public void doSomething() {
[....]
[....]
try {
[....]
[....]
} catch (MyCustomRuntimeException1 | MyCustomRuntimeException2 ex) {
log.error("!! doSomething: An error occurred", ex);
var code = ex.getCode();
var message = ex.getMessage();
[......]
[......]
}
}
我收到一个编译时错误,内容为以下行中的无法解析“RuntimeException”中的“getCode”方法
:
var code = ex.getCode();
另一方面,这段代码可以正常工作:
public void doSomething() {
[....]
[....]
try {
[....]
[....]
} catch (MyCustomRuntimeException1 ex) {
log.error("!! doSomething: An error occurred", ex);
var code = ex.getCode();
var message = ex.getMessage();
[......]
[......]
} catch (MyCustomRuntimeException2 ex) {
log.error("!! doSomething: An error occurred", ex);
var code = ex.getCode();
var message = ex.getMessage();
[......]
[......]
}
}
最佳答案
我相信,当您有多个 catch 子句时,这里发生的情况是,在您的情况下,异常参数的推断类型 ex
是最接近的常见父类(super class) 多捕获中列出的异常。我在语言引用中找不到这一点的明确记录,但至少在一个地方暗示了这一点。请参阅 14.20. the try statement 末尾的示例
因此,两个异常类中最接近的公共(public)父类(super class)是 RuntimeException
,它当然没有 getCode()
方法。
正如 @VasilyLiakovsky 在评论中建议的那样,您可以创建一个抽象中间类来定义您想要共享的通用方法。
关于java - 编译错误在同一个catch子句中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72064269/