É um erro que gera uma exceção que o Java lança quando o ClassLoader de uma máquina virtual Java (JVM) tenta carregar na definição de uma classe (uma chamada de um método ou na criação de uma nova instância usando a expressão new) e a definição da classe pôde ser encontrado. Ou seja, quando o código foi compilado, a definição da classe existia, mas durante a execução o ClassLoader não consegui achá-la.
Geralmente há uma mensagem neste padrão:
java.lang.NoClassDefFoundError: <nome da classe>
Podemos cria um código e Java com este erro, lançando a exceção acima:
1) Crie um arquivo chamado Principal.java, com este código:
public class Principal {
public static void main(String[] args) {
new Segundo();
}
}
2) Cria um segundo arquivo chamado Segundo.java, com este código:
class Segundo {
public static void main(String[] args) {
}
}
3) Temos que compilar as classes que criamos, basta utilizar o seguinte comando:
javac *.java
4) Agora vamos executar uma chamada para a classe Principal, que por sua vez irá instanciar a classe Segundo. Como ambas as classes estão juntas, durante a execução o ClassLoader acha e utiliza ambas as classes e tudo vai bem, sem erros:
java Principal
*Como o programa não faz nada, não veremos nenhuma mensagem ou erro. É o que desejamos, caso apareça algum erro neste ponto, atualize a versão do seu Java.
5) Agora apague o arquivo Segundo.class, e execute a classe novamente:
java Principal
Exception in thread "Main Thread" java.lang.NoClassDefFoundError: Segundo
at Principal.main(Principal.java:3)
Perceba que, quando as classes foram compiladas (javac *.java), ambas foram criadas e a classe Principal.class conhecia a classe Segundo.class. Na primeira execução não houve erros porque a classe estava lá. Como a classe Segundo.class foi apagada, na segunda execução o ClassLoader não achou a classe, o que ocasionou erro NoClassDefFoundError.
Quando tudo foi compilado a classe existia. Normalmente este erro ocorre porque, num ambiente corporativo, as classes são compiladas numa máquina e as aplicações rodam em outra. Caso alguma classe não seja enviada para o servidor que irá executar o sistema, veremos este erro. Ou seja, no momento de executar o código, a classe Principal não estava mais disponível. Isso é um erro inesperado, portanto NoClassDefFoundError é um java.lang.Error.