Impossibile trovare o caricare l'errore della classe principale

1. Introduzione

Occasionalmente, quando eseguiamo un programma Java, potremmo vedere "Impossibile trovare o caricare la classe principale". È facile indovinare il motivo: la JVM non è riuscita a trovare la classe principale e ha fornito questo errore. Ma perché non poteva?

In questo tutorial, discuteremo le probabili ragioni della mancata ricerca della classe principale. Inoltre, vedremo come risolverli.

2. Programma di esempio

Inizieremo con un programma HelloWorld :

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }

Ora, compilarlo:

$ javac HelloWorld.java

Qui, il compilatore genererà un file .class per il nostro programma. Questo file .class verrà generato nella stessa directory. Il file .class avrà lo stesso nome del nome della classe fornito nel programma Java. Questo file .class è eseguibile.

Nelle sezioni seguenti, eseguiremo questo file .class e proveremo a comprendere le probabili ragioni dell'errore "Impossibile trovare o caricare la classe principale".

3. Nome classe errato

Per eseguire un file .class generato dal compilatore Java, possiamo utilizzare il comando seguente:

java 

Ora eseguiamo il nostro programma:

$ java helloworld Error: Could not find or load main class helloworld

Sì, è fallito con l'errore "Impossibile trovare o caricare la classe principale helloworld".

Come discusso in precedenza, il compilatore genererà il file .class con lo stesso identico nome assegnato alla classe Java nel programma . Quindi nel nostro caso, la classe principale avrà il nome HelloWorld , non helloworld .

Facciamo un altro tentativo con l'involucro corretto:

$ java HelloWorld Hello world..!!!

Questa volta è stato eseguito correttamente.

3.1. Estensione del file

Per compilare un programma Java, dobbiamo fornire il nome del file con la sua estensione (. Java ):

$ javac HelloWorld.java

Ma per eseguire un file. class , dobbiamo fornire il nome della classe, non il nome del file. Quindi non è necessario fornire l' estensione .class :

$ java HelloWorld.class Error: Could not find or load main class HelloWorld.class

Quindi, ancora una volta, eseguiamo il nostro programma utilizzando il nome della classe corretto:

$ java HelloWorld Hello world..!!!

4. Nomi dei pacchetti Java

In Java, teniamo insieme classi simili in quello che chiamiamo pacchetto .

La mossa di Let HelloWorld classe nella com.baeldung pacchetto:

package com.baeldung; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }

Ora, compiliamo ed eseguiamo il programma HelloWorld aggiornato come prima:

$ java HelloWorld Error: Could not find or load main class HelloWorld

Ma ancora una volta otteniamo l'errore "Impossibile trovare o caricare la classe principale HelloWorld"!

Cerchiamo di capire cosa ci siamo persi qui.

Per eseguire una classe Java che si trova in un pacchetto, dobbiamo fornire il suo nome completo . Quindi nel nostro caso, il nome completo di HelloWorld è com.baeldung.HelloWorld .

Ora, quando abbiamo creato il pacchetto com.baeldung , abbiamo effettivamente creato una struttura di cartelle come:

com/baeldung/HelloWorld.java

Per prima cosa, proviamo a eseguire il nostro programma dalla directory com / baeldung :

$ java com.baeldung.HelloWorld Error: Could not find or load main class com.baeldung.HelloWorld

Tuttavia, non siamo in grado di eseguire il nostro programma.

Qui, quando abbiamo specificato il nome completo della classe com.baeldung.HelloWorld , Java ha cercato di trovare il file HelloWorld.class in com / baeldung , nella directory da cui stavamo eseguendo il programma.

Poiché eravamo già in com / baeldung , Java non è riuscito a trovare ed eseguire il programma HelloWorld .

Ora torniamo alla cartella principale ed eseguiamola:

$ java com.baeldung.HelloWorld Hello world..!!!

Sì, siamo di nuovo in grado di dire "Ciao" al mondo.

5. Classpath non valido

Prima di andare avanti, capiamo prima qual è il classpath: è l'insieme di classi disponibili per la nostra JVM attualmente in esecuzione.

Usiamo la variabile classpath per dire alla JVM dove trovare i file .class sul filesystem.

Durante l'esecuzione di un programma, possiamo fornire il classpath utilizzando l' opzione -classpath . esempio:

java -classpath /my_programs/compiled_classes HelloWorld

Qui, Java cercherà il file HelloWorld.class nella cartella / my_programs / compiled_classes , una cartella di cui abbiamo appena creato il nome. Per impostazione predefinita, la variabile classpath è impostata su ".", Ovvero la directory corrente.

Nella sezione precedente, abbiamo cambiato la nostra directory per eseguire il nostro programma. E se volessimo eseguirlo da un'altra cartella? Ecco quando la variabile classpath ci aiuta.

Per eseguire il nostro programma dalla directory com / baeldung possiamo semplicemente affermare che il nostro classpath è di due directory in alto, una per ogni parte del pacchetto:

$ java -claspath ../../ com.baeldung.HelloWorld Hello world..!!!

Qui, ".." rappresenta la directory principale. Nel nostro caso "../../" rappresenta il vertice della nostra gerarchia di pacchetti.

6. Conclusione

In questo tutorial, abbiamo appreso le probabili ragioni dell'errore "Impossibile trovare o caricare la classe principale".

Quindi, ovviamente, abbiamo anche imparato come risolvere questo errore.