Cos'è Java Lang NoclassDeffoundError?

Cos'è Java Lang NoclassDeffoundError?
Nel Java.Lang.* pacchetto, c'è una classe denominata, NoclassDeffounderror. La descrizione di qualsiasi classe è la definizione della classe. NoclassDeffoundError non è per la definizione di classe trovata Errore. Questo viene lanciato quando l'istanza della Java Virtual Machine (JVM) o un Classloader tenta di caricare nella definizione di una classe, ma non è stata trovata alcuna definizione della classe.

Questo articolo illustra cosa è NoclassDeffoundError e fornisce risoluzioni. Fornisce due scenari importanti per l'eccezione da lanciare e fornisce le rispettive risoluzioni.

Scenario della riga di comando

Una situazione di esempio in cui ciò può verificarsi è la seguente: Supponiamo che la directory DIR1 esista nell'utente@Hostname: ~ $ Directory. Nella directory, dir1, il file sorgente Java, TheClass.Java, ha la classe Java principale, il tetto. Ora, al prompt dei comandi, utente@hostname: ~ $, il programmatore compila il file di origine.Java, con il comando:

Javac Dir1/TheClass.Giava

La compilation passerà correttamente per avere un file bytecode, TheClass.Classe, che sarebbe stata prodotta nella directory DIR1. Se il programmatore continua quindi a eseguire il file, il punto.classe, con il seguente comando:

Java Dir1/TheClass

Al terminale, avrebbe ricevuto il messaggio di errore:

Errore: non è stato possibile trovare o caricare la classe principale dir1.La classe
Causato da: Java.Lang.NOCLASSDEFFOUNDERROR: TheClass (Nome sbagliato: Dir1/TheClass)

Il programmatore può pensare che ciò sia dovuto al fatto che non ha scritto l'intero nome file di bytecode al prompt dei comandi. Quindi potrebbe provare a eseguire il programma con il seguente comando:

Java Dir1/TheClass.classe

Se lo facesse, avrebbe ricevuto il messaggio di errore:

Errore: non è stato possibile trovare o caricare la classe principale dir1.La classe.classe
Causato da: Java.Lang.ClassNotFoundException: DIR1.La classe.classe

Questo articolo è su NoclassDeffounderror, e quindi ClassNotFoundException non sarebbe affrontato. Il comando,

Java Dir1/TheClass

dovrebbe funzionare, ma non ha funzionato. Secondo l'autore, il vero problema in questa situazione è con il linguaggio Java e non quello del programmatore.

NoclassDeffoundError in Java si verifica quando Java Virtual Machine non è in grado di trovare una particolare classe in fase di esecuzione. Questo può accadere anche all'interno di un programma in esecuzione - vedi sotto.

Risoluzione

Per risolvere questo problema, vai alla directory, Dir1 ed esegui il programma da lì, con i seguenti comandi, al terminale, dalla directory dell'utente:

CD DIR1
Java theclass

Scenario di classe bytecode mancante

In questa sezione, l'utente della directory@hostname: ~/dir1 $, verrà utilizzato esclusivamente. Considera il seguente programma Java:

classe aclass

Classe pubblica Mainclass
public static void main (string [] args)
Aclass obj = new aclass ();

Supponiamo che questo sia in un file e salvato con il nome, Mainclass.Java nella directory, user@hostname: ~/dir1 $. Il comando seguente compilerà il file:

User@hostname: ~/dir1 $ javac mainclass.Giava

Il risultato sarà due file, Mainclass.Java e Mainclass.classe, nella stessa directory, dir1. Mainclass.Java è il file di origine e la mainclass.La classe è il file bytecode. Per eseguire un programma in Java, è il file di codice byte che viene eseguito. Il seguente comando al terminale eseguirà il programma:

User@hostname: ~/dir1 $ java mainclass

Notare che ".Class ”non è digitato, sebbene sia il suo file che è coinvolto. Non dovrebbe esserci alcun output perché nel programma non esiste un comando di stampa. Dovrebbe esserci solo il nuovo prompt dei comandi, indicando che la classe Mainclass ha eseguito correttamente il programma. Ecco come funziona Java.

Avere le classi come due file di file

Le due classi precedenti possono essere salvate come due diversi file di origine, con i nomi, ACLASS.Java e TheClass.Giava. Una classe.Java avrebbe il codice per l'aclass e il tetto.Java avrebbe il codice per Mainclass, con il suo nome file rinominato per la protezione.

Quando questi due file si trovano nella stessa directory, DIR1, solo TheClass.Java deve essere nel comando di compilazione. Integrerebbe aclass.Giava . Il seguente comando è sufficiente:

User@hostname: ~/dir1 $ javac theclass.Giava

Nella directory, DIR1, risulteranno due nuovi file: Theclass.Classe e Aclass.classe . Questi sono file bytecode. La classe.La classe corrisponde al tetto.Java e aclass.La classe corrisponde al tetto.classe.

Ora, per eseguire il programma, solo il tetto.Il file di classe deve essere comandato (senza estensione, ".classe"). Integrerà il file bytecode, aclass.classe. Il seguente comando è sufficiente per eseguire la classe:

User@hostname: ~/dir1 $ java theclass

Come prima, non c'è output. Il nuovo prompt dei comandi dovrebbe apparire, mostrando che il programma è stato eseguito correttamente.

NoclassDeffoundError in Java si verifica quando Java Virtual Machine non è in grado di trovare una particolare classe in fase di esecuzione. Ciò può accadere anche all'interno di un programma in esecuzione, come è illustrato in questa sezione.

Ora, aclass.La classe è parte integrante del tetto.classe. In altre parole, il tetto.La classe non può funzionare senza aclasse.classe. Quindi, se ACLASS.La classe viene eliminata o rinominata, verrebbe lanciato NoclassDeffounderror. La visualizzazione dell'errore del terminale, per il comando sopra, sarebbe:

Eccezione nel thread "Main" Java.Lang.NOCLASSDEFFOUNDERROR: ACLASS
a Theclass.Main (TheClass.Java: 9)
Causato da: Java.Lang.ClassNotFoundException: aclass
a Java.base/jdk.interno.caricatore.EluctInClassloader.LoadClass (buildinclassloader.Java: 581)
a Java.base/jdk.interno.caricatore.ClassLoader $ AppClassLoader.LoadClass (ClassLoader.Java: 178)
a Java.base/java.Lang.Classloader.LoadClass (ClassLoader.Java: 522)
... 1 altro

Risoluzione

Questo problema può essere risolto come segue: se l'Aclass.La classe è stata trasferita lontano dalla sua directory, dovrebbe essere riportata. Se è stato eliminato, supponendo che l'aclass.Java e aclass.Java non è stato eliminato, quindi il programma deve essere ricompilato, con

User@hostname: ~/dir1 $ javac theclass.Giava

e un nuovo aclass.la classe nella directory, DIR1, verrebbe creata. E il comando,

User@hostname: ~/dir1 $ java theclass

non emetterebbe il messaggio di errore lungo sopra per NocLassDeffOunderror.

Possibilità di recuperare

NoclassDeffoundError è un errore di runtime, quindi non dipende davvero dal programmatore da recuperare da esso. Come spiegato sopra, il modo migliore per gestire il problema è per risoluzione.

Conclusione

Nel Java.Lang.* pacchetto, c'è una classe denominata, NoclassDeffounderror. La descrizione di qualsiasi classe è la definizione della classe. NoclassDeffoundError non è per la definizione di classe trovata Errore. Questo viene lanciato quando l'istanza della Java Virtual Machine (JVM) o un Classloader tenta di caricare nella definizione di una classe, ma non è stata trovata alcuna definizione della classe.

NoclassDeffoundError è un errore di runtime, quindi non dipende davvero dal programmatore da recuperare da esso. Il modo migliore per gestire il problema è per risoluzione: utilizzare il comando riga di comando per eseguire il comando nella directory di interesse. Sostituire qualsiasi .file di classe; Non è lì che doveva essere.