Почему ошибка NoClassDefFoundError вызвана ошибкой инициализации статического поля?

Вот интересный вопрос java.

Следующая простая программа на Java содержит статическое поле, инициализированное методом статически. На самом деле, я заставляю метод, который вычисляет значение intiailize, вызывать исключение NullPointException. Когда я получаю доступ к такому статическому полю, возникает исключение NoClassDefFoundError. похоже, что виртуальная машина обрабатывает класс не полностью.

Но когда я получаю доступ к Классу, он все еще доступен;

Кто-нибудь знает, почему?

class TestClass {
    public static TestClass instance = init();

    public static TestClass init() {
       String a = null;
       a.charAt(0); //force a null point exception;
       return new TestClass();
    }
}

class MainClass {
    static public void main(String[] args) {
       accessStatic(); // a ExceptionInInitializerError raised cause by NullPointer
       accessStatic(); //now a NoClassDefFoundError occurs;

       // But the class of TestClass is still available; why?
       System.out.println("TestClass.class=" + TestClass.class);
    }

    static void accessStatic() {
        TestClass a;

        try {
            a = TestClass.instance; 
        } catch(Throwable e) {
            e.printStackTrace();
        }
    }   
}
34
задан kevinarpe 7 April 2017 в 06:52
поделиться