Когда я пытаюсь передать исключение в блок инициализации экземпляра (не инициализации класса), я получаю ошибку:
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();
}
}