Um NoClassDefFoundError (NCDFE) acontece quando seu código executa "novo Y ()" e não consegue encontrar a classe Y.
Pode ser que Y esteja ausente do seu carregador de classes, como os outros comentários sugerem, mas pode ser que a classe Y não esteja assinada ou tenha uma assinatura inválida, ou que Y esteja carregado por um carregador de classe diferente, não visível para o seu código , ou mesmo que Y dependa de Z, que não pôde ser carregado por qualquer um dos motivos acima.
Se isso acontecer, a JVM lembrará o resultado do carregamento do X (NCDFE) e lançará um novo NCDFE toda vez que você solicitar Y sem informar o motivo:
classe A {
classe estática b {}
public static void main (String args []) {
System.out.println ("Primeira tentativa nova b ():");
tente {novo b (); } catch (Throwable t) {t.printStackTrace ();}
System.out.println ("\ nSegunda tentativa nova b ():");
tente {novo b (); } catch (Throwable t) {t.printStackTrace ();}
}
}
salve isso como a.java em algum lugar
O código simplesmente tenta instanciar uma nova classe "b" duas vezes, além disso, não possui bugs e não faz nada.
Compile o código com javac a.java
, Em seguida, execute a invocando java -cp . a
- ele deve apenas imprimir duas linhas de texto e deve funcionar bem sem erros.
Em seguida, exclua o arquivo "a $ b.class" (ou preencha-o com lixo ou copie a.class sobre ele) para simular a classe ausente ou corrompida. Aqui está o que acontece:
Primeira tentativa nova b ():
java.lang.NoClassDefFoundError: a $ b
em a.main (a.java:5)
Causado por: java.lang.ClassNotFoundException: a $ b
em java.net.URLClassLoader $ 1.run (URLClassLoader.java:200)
em java.security.AccessController.doPrivileged (método nativo)
em java.net.URLClassLoader.findClass (URLClassLoader.java:188)
em java.lang.ClassLoader.loadClass (ClassLoader.java:307)
em sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:301)
em java.lang.ClassLoader.loadClass (ClassLoader.java:252)
em java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
... mais 1
Segunda tentativa nova b ():
java.lang.NoClassDefFoundError: a $ b
em a.main (a.java:7)
A primeira chamada resulta em uma ClassNotFoundException (lançada pelo carregador de classes quando não consegue encontrar a classe), que deve ser agrupada em um NoClassDefFoundError desmarcado, pois o código em questão ( new b()
) deve funcionar.
Obviamente, a segunda tentativa também falhará, mas como você pode ver, a exceção agrupada não existe mais, porque o ClassLoader parece lembrar os carregadores de classes com falha. Você vê apenas o NCDFE com absolutamente nenhuma pista do que realmente aconteceu.
Portanto, se você vir um NCDFE sem causa raiz, precisará verificar se consegue rastrear desde a primeira vez em que a classe foi carregada para encontrar a causa do erro.
-verbose
(por exemplo-verbose:class -verbose:jni
) ajuda - mas os relatórios mogsie abaixo sua resposta que este não fornece nenhuma informação útil adicional :(