gpt4 book ai didi

java - 为什么不允许在 Java 实例初始化 block 中抛出异常?

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:45 25 4
gpt4 key购买 nike

当我尝试在实例初始化(不是类初始化) block 中抛出异常时,出现错误:

initializer must be able to complete normally

Java 自己会,为什么不允许?

以下示例创建了四个类。由于 ArithmeticException,类 A 在实例化期间失败。这可以用 catch 来处理。 B 也是如此,它因 NullPointerException 而失败。但是当我尝试像在 C 中那样自己抛出 NullPointerException 时,程序无法编译。当我尝试定义自己的 RuntimeException 时,我遇到了与 D 中相同的错误。所以:

我怎样才能做到与 Java 本身相同的事情?

// -*- compile-command: "javac expr.java && java expr"; -*-

class expr
{
class A
{
int y;
{{ y = 0 / 0; }}
}

class B
{
Integer x = null;
int y;
{{ y = x.intValue(); }}
}

class C
{
{{ throw new NullPointerException(); }}
}

class Rex extends RuntimeException {}

class D
{
{{ throw new Rex(); }}
}

void run ()
{
try { A a = new A(); }
catch (Exception e) { System.out.println (e); }

try { B b = new B(); }
catch (Exception e) { System.out.println (e); }

try { C c = new C(); }
catch (Exception e) { System.out.println (e); }

try { D d = new D(); }
catch (Exception e) { System.out.println (e); }
}

public static void main (String argv[])
{
expr e = new expr();
e.run();
}
}

最佳答案

initializer must be able to complete normally

表示必须存在不抛出异常的可能代码路径。您的示例无条件抛出,因此被拒绝。在其他示例中,静态分析还不足以确定它们在所有情况下都会抛出。

例如,

public class StaticThrow {
static int foo = 0;
{{ if (Math.sin(3) < 0.5) { throw new ArithmeticException("Heya"); } else { foo = 3; } }}
public static void main(String[] args) {
StaticThrow t = new StaticThrow();
System.out.println(StaticThrow.foo);
}
}

编译,运行时抛出

Exception in thread "main" java.lang.ArithmeticException: Heya
at StaticThrow.<init>(StaticThrow.java:3)
at StaticThrow.main(StaticThrow.java:5)

关于java - 为什么不允许在 Java 实例初始化 block 中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13532794/

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