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.JawaKompilacja 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/theclassNa terminalu otrzymałby komunikat o błędzie:
Błąd: nie można znaleźć ani załadować głównej klasy DIR1.KlasaProgramista 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.klasaGdyby to zrobił, otrzymałby komunikat o błędzie:
Błąd: nie można znaleźć ani załadować głównej klasy DIR1.Klasa.klasaTen artykuł dotyczy NoclassDeffoundError, a więc ClassNotFoundException nie byłby rozwiązany. Komenda,
java dir1/theclassma 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 Dir1Brak scenariusza klasy bajtowej
W tej sekcji katalog użytkownika@hostName: ~/dir1 $, będzie używany wyłącznie. Rozważ następujący program Java:
klasa AclassZałóż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.JawaWynikiem 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 mainclassZauważ, ż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.JawaW 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 thlassPodobnie 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: ACLASSRezolucja
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.Jawai nowy aklass.Klasa w katalogu, Dir1, zostanie stworzona. I polecenie,
użytkownik@hostName: ~/dir1 $ java thlassnie 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ć.