Pourquoi NoClassDefFoundError causée par un champ statique de l'initialisation de l'échec?

Voici un intéressant java question.

suivantes simple programme java contient un champ statique initialisé par une méthode statique. En fait, j'ai de la force de la méthode de calculer la intiailize valeur pour élever un NullPointException, Quand je accéder à un champ statique, un NoClassDefFoundError seront soulevées. il semble que la VM traiter la Classe n'est pas complète.

Mais lorsque j'accède à la Classe, il toujours disponible;

Personne ne sait pourquoi?

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();
        }
    }   
}
  • C'est surprenant pour moi, trop! Je ping un ami qui pourrait connaître la réponse; nous allons voir s'il répond.
  • Je pense que, le chargeur de classe ne parvient pas à charger la TestClass en raison de l'exception dans l'initialiseur statique
  • cette partie est triviale; je ne crois pas qu'il demande même à ce sujet. Ce qui est étonnant, est le troisième impression qui montre que TestClass.class dans MainClass contient en fait une référence à un objet physique Class objet. Si la classe n'est pas correctement initialisé, pourquoi sommes-nous autorisés à toucher à tous?
  • TestClass.class ne semble pas déclencher de chargement de classe et on dirait qu'il est accessible et disponible indifférent de savoir si ou non la classe a été chargé.
InformationsquelleAutor ext2 | 2011-06-15