当我尝试在实例初始化(不是类初始化)块中抛出异常时,我收到错误:
initializer must be able to complete normally
为什么尽管 Java 自己做却不允许呢?
下面的示例创建四个类。由于 ArithmeticException ,类A
在实例化期间失败。这可以使用catch
. 同样B
失败并出现 NullPointerException。但是当我尝试自己抛出 NullPointerException 时C
,程序无法编译。当我尝试定义我自己的 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();
}
}