+-
为什么不允许在Java实例初始化块中抛出异常?
当我尝试在实例初始化(而不是类初始化)块中抛出异常时,我得到错误:

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实例初始化块中抛出异常? - 乐贴网