Este artigo ilustra o que é noclassDeffoundError e fornece resoluções. Ele fornece dois cenários importantes para a exceção a ser lançada e oferece suas respectivas resoluções.
Cenário da linha de comando
Um exemplo de situação em que isso pode ocorrer é o seguinte: Suponha que o diretório Dir1 exista no usuário@hostName: ~ diretório. No diretório, Dir1, o arquivo de origem Java, TheClass.Java, tem a classe Java principal, o TheClass. Agora, no prompt de comando, user@hostName: ~ $, o programador compila o arquivo de origem, o TheClass.Java, com o comando:
Javac Dir1/TheClass.JavaA compilação passará com sucesso para ter um arquivo de bytecode, theclass.classe, que seria produzida no diretório dir1. Se o programador continuar a executar o arquivo, o Teclass.classe, com o seguinte comando:
Java Dir1/TheClassNo terminal, ele receberia a mensagem de erro:
Erro: não foi possível encontrar ou carregar a classe principal dir1.A classeO programador pode pensar que isso ocorre porque ele não escreveu todo o nome do arquivo bytecode no prompt de comando. Então ele pode tentar executar o programa com o seguinte comando:
Java Dir1/TheClass.aulaSe ele fizesse isso, ele receberia a mensagem de erro:
Erro: não foi possível encontrar ou carregar a classe principal dir1.A classe.aulaEste artigo está no NoclassDeffoundError e, portanto, ClassNotFoundException não seria abordado. O comando,
Java Dir1/TheClassdeve funcionar, mas não funcionou. Na opinião do autor, o verdadeiro problema nessa situação é com a língua java e não a do programador.
NoclassDeffoundError em Java ocorre quando a Java Virtual Machine não consegue encontrar uma classe específica em tempo de execução. Isso também pode acontecer em um programa de corrida - veja abaixo.
Resolução
Para resolver esse problema, vá para o diretório, dir1 e execute o programa a partir daí, com os seguintes comandos, no terminal, do diretório do usuário:
CD Dir1Cenário de classe Bytecode ausente
Nesta seção, o usuário do diretório@hostName: ~/dir1 $, será usado exclusivamente. Considere o seguinte programa Java:
classe AclassSuponha que isso esteja em um arquivo e salvo com o nome, MainClass.java no diretório, usuário@hostname: ~/dir1 $. O comando a seguir compilará o arquivo:
Usuário@hostName: ~/dir1 $ javac mainClass.JavaO resultado será de dois arquivos, mainClass.Java e MainClass.classe, no mesmo diretório, dir1. MainClass.Java é o arquivo de origem e mainClass.classe é o arquivo bytecode. Para executar um programa em Java, é o arquivo de código de bytes que é executado. O comando a seguir no terminal executará o programa:
Usuário@hostName: ~/dir1 $ java mainClassObserve que ".classe ”não está digitada, embora seja seu arquivo que está envolvido. Não deve haver saída porque não há comando de impressão no programa. Deve haver apenas o novo prompt de comando, indicando que a classe MainClass executou com sucesso o programa. É assim que Java funciona.
Tendo as aulas como dois pares de arquivos
As duas classes acima podem ser salvas como dois arquivos de origem diferentes, com os nomes, Aclass.Java e TheClass.Java. Uma aula.Java teria o código para aclass.Java teria o código para mainClass, com seu nome de arquivo renomeado para o teclass.
Quando esses dois arquivos estão no mesmo diretório, dir1, apenas o teclass.Java tem que estar no comando de compilação. Isso integraria o Aclass.Java . O comando seguinte é suficiente:
usuário@hostName: ~/dir1 $ javac theClass.JavaNo diretório, Dir1, dois novos arquivos resultarão: theclass.Classe e Aclass.aula . Estes são arquivos bytecode. A classe.Classe corresponde à THECLASS.Java e Aclass.Classe corresponde à THECLASS.aula.
Agora, para executar o programa, apenas o teclass.O arquivo de classe deve ser comandado (sem a extensão, “.aula"). Ele integrará o arquivo bytecode, Aclass.aula. O comando seguinte é suficiente para executar a classe:
usuário@hostName: ~/dir1 $ java theclassComo antes, não há saída. O novo prompt de comando deve aparecer, mostrando que o programa foi executado com sucesso.
NoclassDeffoundError em Java ocorre quando a Java Virtual Machine não consegue encontrar uma classe específica em tempo de execução. Isso também pode acontecer em um programa de corrida, pois é ilustrado nesta seção.
Agora, Aclass.A classe é parte integrante do teclass.aula. Em outras palavras, o teclass.A classe não pode correr sem Aclass.aula. Então, se aclass.A classe é excluída ou renomeada, o NoclassDeffoundError seria jogado. A exibição do erro do terminal, para o comando acima, seria:
Exceção no tópico "principal" java.Lang.NoclassDeffoundError: AclassResolução
Este problema pode ser resolvido da seguinte maneira: se o Aclass.A classe foi transferida para longe de seu diretório, deve ser trazida de volta. Se foi excluído, assumindo que o Aclass.Java e Aclass.Java não foi excluído, então o programa só precisa ser recompilado, com
usuário@hostName: ~/dir1 $ javac theClass.Javae um novo aclass.A classe no diretório, dir1, seria criada. E o comando,
usuário@hostName: ~/dir1 $ java theclassnão emitiria a longa mensagem de erro acima para NoclassDeffoundError.
Possibilidade de se recuperar
NoclassDeffoundError é um erro de tempo de execução, então não cabe ao programador se recuperar. Como explicado acima, a melhor maneira de lidar com o problema é por resolução.
Conclusão
No java.Lang.* Pacote, há uma classe chamada, NoclassDeffoundError. A descrição de qualquer classe é a definição da classe. NoclassDeffoundError significa nenhuma definição de classe encontrada erro. Isso é jogado quando a instância da Java Virtual Machine (JVM) ou um carregador de classe tenta carregar na definição de uma classe, mas nenhuma definição da classe pode ser encontrada.
NoclassDeffoundError é um erro de tempo de execução, então não cabe ao programador se recuperar. A melhor maneira de lidar com o problema é por resolução: use o comando da linha de comando para executar o comando no diretório de interesse. Substitua qualquer .arquivo de classe; não é aí que deveria estar.