O que é Java Lang NoclassDeffoundError?

O que é Java Lang NoclassDeffoundError?
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.

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.Java

A 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/TheClass

No terminal, ele receberia a mensagem de erro:

Erro: não foi possível encontrar ou carregar a classe principal dir1.A classe
Causado por: java.Lang.NoclassDeffoundError: TheClass (nome errado: dir1/theClass)

O 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.aula

Se ele fizesse isso, ele receberia a mensagem de erro:

Erro: não foi possível encontrar ou carregar a classe principal dir1.A classe.aula
Causado por: java.Lang.ClassNotFoundException: Dir1.A classe.aula

Este artigo está no NoclassDeffoundError e, portanto, ClassNotFoundException não seria abordado. O comando,

Java Dir1/TheClass

deve 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 Dir1
Java TheClass

Cená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 Aclass

classe pública mainClass
public static void main (string [] args)
Aclass obj = new aclass ();

Suponha 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.Java

O 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 mainClass

Observe 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.Java

No 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 theclass

Como 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: Aclass
em TheClass.Principal (TheClass.Java: 9)
Causado por: java.Lang.ClassNotFoundException: Aclass
em Java.base/jdk.interno.carregador.BuildInclassLoader.LOADCLASS (BuiltInclassLoader.Java: 581)
em Java.base/jdk.interno.carregador.ClassLoaders $ AppClassLoader.LOADCLASS (CLASSLOADERS.Java: 178)
em Java.base/java.Lang.Classloader.LOADCLASS (CLASTLOADER.Java: 522)
… mais 1

Resoluçã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.Java

e um novo aclass.A classe no diretório, dir1, seria criada. E o comando,

usuário@hostName: ~/dir1 $ java theclass

nã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.