Nie można znaleźć lub załadować błędu klasy głównej

1. Wstęp

Czasami, gdy uruchamiamy program w języku Java, możemy zobaczyć komunikat „Nie można znaleźć lub załadować klasy głównej”. Łatwo odgadnąć przyczynę: maszyna JVM nie znalazła klasy głównej i podała ten błąd. Ale dlaczego nie mógł?

W tym samouczku omówimy prawdopodobne przyczyny niepowodzenia znalezienia klasy głównej. Zobaczymy również, jak je naprawić.

2. Przykładowy program

Zaczniemy od programu HelloWorld :

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

Teraz skompilujmy to:

$ javac HelloWorld.java

Tutaj kompilator wygeneruje plik .class dla naszego programu. Ten plik .class zostanie wygenerowany w tym samym katalogu. Plik .class będzie miał taką samą nazwę jak nazwa klasy podana w programie Java. Ten plik .class jest wykonywalny.

W następnych sekcjach uruchomimy ten plik .class i spróbujemy zrozumieć prawdopodobne przyczyny błędu „Nie można znaleźć lub załadować klasy głównej”.

3. Niewłaściwa nazwa klasy

Aby uruchomić plik .class wygenerowany przez kompilator Java, możemy użyć poniższego polecenia:

java 

Teraz uruchommy nasz program:

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

Tak, niepowodzenie i błąd „Nie można znaleźć lub załadować helloworld głównej klasy”.

Jak wspomniano wcześniej, kompilator wygeneruje plik .class z dokładnie taką samą nazwą, jaka została nadana klasie Java w programie . W naszym przypadku główna klasa będzie miała nazwę HelloWorld , a nie helloworld .

Spróbujmy jeszcze raz z prawidłową obudową:

$ java HelloWorld Hello world..!!!

Tym razem udało się.

3.1. Rozszerzenie pliku

Aby skompilować program Java, musimy podać nazwę pliku wraz z rozszerzeniem (. Java ):

$ javac HelloWorld.java

Ale aby uruchomić. class , musimy podać nazwę klasy, a nie nazwę pliku. Nie ma więc potrzeby podawania rozszerzenia .class :

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

A więc ponownie uruchommy nasz program, używając poprawnej nazwy klasy:

$ java HelloWorld Hello world..!!!

4. Nazwy pakietów Java

W Javie przechowujemy podobne klasy razem w tak zwanym pakiecie .

Przenieśmy klasę HelloWorld do pakietu com.baeldung :

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

Teraz skompilujmy i uruchom zaktualizowany program HelloWorld , jak poprzednio:

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

Ale znowu pojawia się błąd „Nie można znaleźć lub załadować głównej klasy HelloWorld”!

Spróbujmy zrozumieć, co tutaj przegapiliśmy.

Aby uruchomić klasę Java znajdującą się w pakiecie, musimy podać jej w pełni kwalifikowaną nazwę . W naszym przypadku w pełni kwalifikowana nazwa HelloWorld to com.baeldung.HelloWorld .

Teraz, kiedy stworzyliśmy pakiet com.baeldung , faktycznie utworzyliśmy strukturę folderów, taką jak:

com/baeldung/HelloWorld.java

Najpierw spróbujmy uruchomić nasz program z katalogu com / baeldung :

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

Mimo to nie jesteśmy w stanie uruchomić naszego programu.

Tutaj, kiedy określiliśmy w pełni kwalifikowaną nazwę klasy com.baeldung.HelloWorld , Java próbowała znaleźć plik HelloWorld.class w com / baeldung , w katalogu, z którego uruchamialiśmy program.

Ponieważ byliśmy już w com / baeldung , Java nie znalazła i nie uruchomiła programu HelloWorld .

Teraz wróćmy do folderu nadrzędnego i uruchommy go:

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

Tak, znowu możemy powiedzieć „cześć” światu.

5. Nieprawidłowa ścieżka klasy

Zanim przejdziemy dalej, najpierw zrozumiemy, czym jest ścieżka klas - jest to zestaw klas dostępnych dla naszej aktualnie działającej maszyny JVM.

Używamy zmiennej classpath, aby poinformować maszynę JVM, gdzie ma znaleźć pliki .class w systemie plików.

Podczas uruchamiania programu możemy podać ścieżkę klas za pomocą opcji -classpath . przykład:

java -classpath /my_programs/compiled_classes HelloWorld

Tutaj Java wyszuka plik HelloWorld.class w folderze / my_programs / compiled_classes, folderze, którego nazwę właśnie nadaliśmy . Domyślnie zmienna classpath jest ustawiona na „.”, Co oznacza bieżący katalog.

W powyższej sekcji zmieniliśmy nasz katalog, aby uruchomić nasz program. Ale co, jeśli chcemy go uruchomić z innego folderu? Wtedy pomaga nam zmienna classpath.

Aby uruchomić nasz program z katalogu com / baeldung , możemy po prostu stwierdzić, że nasza ścieżka klas to dwa katalogi wyżej - po jednym dla każdej części pakietu:

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

W tym przypadku „..” reprezentuje katalog nadrzędny. W naszym przypadku „../../” reprezentuje szczyt naszej hierarchii pakietów.

6. Wniosek

W tym samouczku poznaliśmy prawdopodobne przyczyny błędu „Nie można znaleźć lub załadować klasy głównej”.

Potem oczywiście nauczyliśmy się również, jak rozwiązać ten błąd.