インスタンスの初期化 (クラスの初期化ではない) ブロックで例外をスローしようとすると、次のエラーが発生します。
initializer must be able to complete normally
Javaはそれ自体を行うのに、なぜ許可されないのですか?
次の例では、4 つのクラスを作成します。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();
}
}