gpt4 book ai didi

java - 在 Java-8 中捕获多个异常

转载 作者:行者123 更新时间:2023-12-01 06:21:46 29 4
gpt4 key购买 nike

在尝试我在 m1() 中发现的多捕获功能时方法一切都按预期正常工作。

然而,在 m2()相同的代码无法编译。我刚刚更改了语法以减少代码行数。

public class Main {

public int m1(boolean bool) {
try {
if (bool) {
throw new Excep1();
}
throw new Excep2();
//This m1() is compiling abs fine.
} catch (Excep1 | Excep2 e) {
return 0;
}
}

public int m2(boolean b) {
try {
throw b ? new Excep1() : new Excep2();
//This one is not compiling.
} catch (Excep1 | Excep2 e) {
return 0;
}
}

private static interface I {
}

private static class Excep1 extends Exception implements I {
}

private static class Excep2 extends Exception implements I {
}
}

为什么不方法 m2()编译?

最佳答案

表达式的类型

b ? new Excep1() : new Excep2()

Exception ,因为这是 Excep1 的常见父类(super class)型和 Excep2 .

但是,您没有 catch Exception ,所以编译器提示它。

如果你抓到 Exception ,它将通过编译:
public int m2(boolean b) {
try {
throw b ? new Excep1() : new Excep2();
} catch (Exception e) {
return 0;
}
}

我试图在您的示例中找到解释条件三元表达式类型的 JLS 条目。

我所能找到的只是这个特定的表达式是 15.25.3. Reference Conditional Expression .

我不完全确定它是否算作多边形表达式或独立表达式。我认为它是独立的(因为 poly 表达式涉及赋值上下文或调用上下文,我不认为 throw 语句算作其中任何一个)。

对于独立表达式:“如果第二个和第三个操作数具有相同的类型(可能是 null 类型),那么这就是条件表达式的类型。”

在您的情况下,第二个和第三个操作数具有三种常见类型 - Object , ThrowableException - 表达式的类型必须是后两者之一,因为“throw 语句中的表达式必须表示一个变量或引用类型的值,该变量或值可以分配给 Throwable 类型(第 5.2 节)。”

似乎编译器选择了最具体的常见类型( Exception ),因此选择了 catch (Exception e)解决编译错误。

我还尝试将您的两个自定义异常替换为 IOException 的两个子类, 在这种情况下 catch (IOException e)解决编译错误。

关于java - 在 Java-8 中捕获多个异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59662659/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com