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

Ответы на вопрос(7)

Ваш ответ на вопрос