Почему нельзя создавать исключение в блоке инициализации экземпляра Java?
Когда я пытаюсь вызвать исключение в блоке инициализации экземпляра (не инициализации класса), я получаю сообщение об ошибке:
initializer must be able to complete normally
Почему это не разрешено, хотя Java это делает сама?
В следующем примере создаются четыре класса. КлассA
происходит сбой во время создания экземпляра из-за ArithmeticException. Это можно и обработать с помощью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();
}
}