+-

当我尝试在实例初始化(而不是类初始化)块中抛出异常时,我得到错误:
initializer must be able to complete normally
尽管Java本身就是这样,为什么不允许这样做?
以下示例创建了四个类.由于ArithmeticException,类A在实例化期间失败.这可以通过捕获来处理. B的失败与NullPointerException失败.但是当我尝试在C中自己抛出NullPointerException时,程序无法编译.当我尝试在D中定义自己的RuntimeException时,我得到了同样的错误.所以:
我怎么能像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实例初始化块中抛出异常? - 乐贴网