【发布时间】:2012-11-23 16:30:11
【问题描述】:
当我尝试在实例初始化(不是类初始化)块中抛出异常时,我收到错误:
initializer must be able to complete normally
为什么Java自己做却不允许?
以下示例创建了四个类。由于 ArithmeticException,类 A 在实例化期间失败。这可以通过catch 处理。 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();
}
}
【问题讨论】:
-
@AlexWien 你知道类和对象的区别吗? ;-)
-
是的,但不存在实例初始化器,我只知道静态初始化器。
标签: java