Co to jest Java Lang NoclassDeffounderror?

Co to jest Java Lang NoclassDeffounderror?
W Javie.Lang.* Pakiet, jest klasa o nazwie NoclassDeffoundError. Opis każdej klasy jest definicją klasy. NocLassDeffoundError oznacza brak błędu definicji klasy. Jest to rzucane, gdy instancja maszyny wirtualnej Java (JVM) lub klasę Próbuje załadować definicję klasy, ale nie można znaleźć definicji klasy.

W tym artykule ilustruje NoclassDeffoundError i zawiera postanowienia. Zapewnia dwa ważne scenariusze dla wyjątku do rzucenia i daje odpowiednie rozdzielczości.

Scenariusz wiersza poleceń

Przykładowa sytuacja, w której może się to zdarzyć następujące: Załóżmy, że katalog Dir1 istnieje w katalogu użytkownika@hostName: ~ $. W katalogu, Dir1, plik źródłowy Java, thass.Java, ma główną klasę Java, thass. Teraz, w wierszu polecenia, użytkownik@hostName: ~ $, programista kompiluje plik źródłowy, thass.Java, z poleceniem:

javac dir1/theclass.Jawa

Kompilacja przejdzie z powodzeniem, aby mieć plik bajtowy, thlass.klasa, która byłaby wyprodukowana w katalogu DIR1. Jeśli programista nadal uruchamia plik, thlass.klasa, z następującym poleceniem:

java dir1/theclass

Na terminalu otrzymałby komunikat o błędzie:

Błąd: nie można znaleźć ani załadować głównej klasy DIR1.Klasa
Spowodowane przez: Java.Lang.NOCLASSDEFFOUNDERROR: THEClass (Niewłaściwa nazwa: Dir1/THEClass)

Programista może pomyśleć, że dzieje się tak, ponieważ nie napisał całej nazwy pliku bajtowego na wierszu polecenia. Może więc spróbować uruchomić program z następującym poleceniem:

java dir1/theclass.klasa

Gdyby to zrobił, otrzymałby komunikat o błędzie:

Błąd: nie można znaleźć ani załadować głównej klasy DIR1.Klasa.klasa
Spowodowane przez: Java.Lang.ClassNotFoundException: Dir1.Klasa.klasa

Ten artykuł dotyczy NoclassDeffoundError, a więc ClassNotFoundException nie byłby rozwiązany. Komenda,

java dir1/theclass

ma działać, ale to nie działało. W opinii autora prawdziwym problemem w tej sytuacji jest język Java, a nie programista.

NoclassDeffoundError w Javie występuje, gdy maszyna wirtualna Java nie jest w stanie znaleźć konkretnej klasy w czasie wykonywania. Może się to również zdarzyć w ramach działającego programu - patrz poniżej.

Rezolucja

Aby rozwiązać ten problem, przejdź do katalogu, DIR1 i uruchom stamtąd program, z następującymi poleceniami, na terminalu, z katalogu użytkowników:

CD Dir1
Java theclass

Brak scenariusza klasy bajtowej

W tej sekcji katalog użytkownika@hostName: ~/dir1 $, będzie używany wyłącznie. Rozważ następujący program Java:

klasa Aclass

klasa publiczna mainClass
public static void main (string [] args)
Aclass obj = new aclass ();

Załóżmy, że jest to w jednym pliku i zapisane z nazwą, MainClass.Java w katalogu, użytkownik@hostName: ~/dir1 $. Następujące polecenie skompiluje plik:

użytkownik@hostName: ~/dir1 $ Javac Mainclass.Jawa

Wynikiem będą dwa pliki, klasa main.Java i Mainclass.klasa, w tym samym katalogu, DIR1. Klasa main.Java to plik źródłowy i główna klasa.klasa to plik bajtowy. Aby uruchomić program w Javie, jest to uruchomiony plik kodu bajtów. Poniższe polecenie na terminalu uruchomi program:

użytkownik@hostName: ~/dir1 $ java mainclass

Zauważ, że „.klasa ”nie jest wpisana, choć jest to jego plik, który jest zaangażowany. Nie powinno być wyjścia, ponieważ w programie nie ma polecenia drukujnego. Powinien być tylko nowy wiersz polecenia, co wskazuje, że klasa MainClass z powodzeniem wykonała program. Tak działa Java.

Posiadanie zajęć jako dwóch par plików

Powyższe dwie klasy można zapisać jako dwa różne pliki źródłowe, z nazwami, aclass.Java i TheClass.Jawa. Klasa.Java miałaby kod Aclass i THEClass.Java miałaby kod dla mainclass, z nazwą pliku przemianowaną na thlass.

Gdy te dwa pliki znajdują się w tym samym katalogu, Dir1, tylko thass.Java musi być w poleceniu kompilacji. Zintegrowałby aklascję.Jawa . Wystarcza następujące polecenie:

użytkownik@hostName: ~/dir1 $ javac thlass.Jawa

W katalogu DIR1 spowodują dwa nowe pliki: theclass.klasa i aklascja.klasa . To są pliki bajtowe. Klasa.klasa odpowiada thass.Java i Aclass.klasa odpowiada thass.klasa.

Teraz, aby uruchomić program, tylko klasa.Plik klas musi być dowodzony (bez rozszerzenia, „.klasa"). Zintegruje plik bajtowy, Aclass.klasa. Poniższe polecenie wystarcza do uruchomienia klasy:

użytkownik@hostName: ~/dir1 $ java thlass

Podobnie jak wcześniej, nie ma wyjścia. Powinien pojawić się nowy wiersz polecenia, pokazując, że program został pomyślnie wykonany.

NoclassDeffoundError w Javie występuje, gdy maszyna wirtualna Java nie jest w stanie znaleźć konkretnej klasy w czasie wykonywania. Może się to również zdarzyć w ramach działającego programu, jak to ilustruje w tej sekcji.

Teraz Aclass.klasa jest integralną częścią theclass.klasa. Innymi słowy, thass.Klasa nie może działać bez aklascji.klasa. Więc jeśli aklass.klasa jest usunięta lub przemianowana, NoclassDeffoundError zostanie rzucona. Wyświetlacz błędu terminala dla powyższego polecenia byłby:

Wyjątek w wątku „główna” Java.Lang.NOCLASSDEFFOUNDERROR: ACLASS
na thlass.Główny (thass.Java: 9)
Spowodowane przez: Java.Lang.ClassNotFoundException: Aclass
w Javie.baza/jdk.wewnętrzny.ładowarka.BuildInclassloader.loadClass (BuildInclassloader.Java: 581)
w Javie.baza/jdk.wewnętrzny.ładowarka.Classloaders $ AppClassloader.LOADCLASS (Classloaders.Java: 178)
w Javie.baza/java.Lang.Klasę ładującą.loadClass (klasę ładującą.Java: 522)
… jeszcze 1

Rezolucja

Problem ten można rozwiązać w następujący sposób: jeśli AClass.klasa została przeniesiona z katalogu, należy ją przywrócić. Jeśli został usunięty, zakładając, że aklass.Java i Aclass.Java nie zostały usunięte, a następnie program musi zostać ponownie skompilowany

użytkownik@hostName: ~/dir1 $ javac thlass.Jawa

i nowy aklass.Klasa w katalogu, Dir1, zostanie stworzona. I polecenie,

użytkownik@hostName: ~/dir1 $ java thlass

nie wydałby powyższego długiego komunikatu o błędzie dla NoclassDeffoundError.

Możliwość odzyskania

NoclassDeffoundError to błąd środowiska wykonawczego, więc tak naprawdę nie należy do programisty, aby się z niego odzyskać. Jak wyjaśniono powyżej, najlepszym sposobem poradzenia sobie z problemem jest rozdzielczość.

Wniosek

W Javie.Lang.* Pakiet, jest klasa o nazwie NoclassDeffoundError. Opis każdej klasy jest definicją klasy. NocLassDeffoundError oznacza brak błędu definicji klasy. Jest to rzucane, gdy instancja maszyny wirtualnej Java (JVM) lub klasę Próbuje załadować definicję klasy, ale nie można znaleźć definicji klasy.

NoclassDeffoundError to błąd środowiska wykonawczego, więc tak naprawdę nie należy do programisty, aby się z niego odzyskać. Najlepszym sposobem obsługi problemu jest rozdzielczość: Użyj polecenia wiersza polecenia, aby wykonać polecenie w katalogu zainteresowania. Wymienić dowolne .plik klasowy; To nie jest tam, gdzie miało być.