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