Hva er Java Lang NoclassDeffoundError?

Hva er Java Lang NoclassDeffoundError?
I javaen.lang.* Pakke, det er en klasse som heter NoclassDeffoundError. Enhver klasses beskrivelse er klassens definisjon. NoclassDeffoundError står for ingen klassedefinisjon funnet feil. Dette kastes når forekomsten av Java Virtual Machine (JVM) eller en klasselaster prøver å laste inn definisjonen av en klasse, men ingen definisjon av klassen ble funnet.

Denne artikkelen illustrerer hva NoclassDeffoundError er og gir oppløsninger. Det gir to viktige scenarier for at unntaket blir kastet og gir deres respektive resolusjoner.

Kommandolinje -scenario

Et eksempel på situasjonen der dette kan oppstå er som følger: Anta at katalogen Dir1 eksisterer i brukeren@Hostname: ~ $ Directory. I katalogen, Dir1, Java -kildefilen, TheClass.Java, har den viktigste Java -klassen, theclass. Nå, på kommandoprompet, bruker@hostname: ~ $, programmerer sammenstiller kildefilen, theclass.Java, med kommandoen:

Javac Dir1/TheClass.Java

Samlingen vil gå gjennom med suksess for å ha en bytecode -fil, TheClass.klasse, som vil bli produsert i DIR1 -katalogen. Hvis programmereren deretter fortsetter å kjøre filen.Klasse, med følgende kommando:

Java Dir1/TheClass

På terminalen ville han motta feilmeldingen:

Feil: kunne ikke finne eller laste hovedklasse DIR1.Klassen
Forårsaket av: java.lang.NoclassDeffoundError: TheClass (Feil navn: Dir1/TheClass)

Programmereren kan tro at dette er fordi han ikke skrev hele bytecode -filnavnet på ledeteksten. Så han kan prøve å kjøre programmet med følgende kommando:

Java Dir1/TheClass.klasse

Hvis han gjorde det, ville han få feilmeldingen:

Feil: kunne ikke finne eller laste hovedklasse DIR1.Klassen.klasse
Forårsaket av: java.lang.ClassNotFoundException: Dir1.Klassen.klasse

Denne artikkelen er på NoClassDeffoundError, og så vil ikke ClassNotfoundException bli adressert. Kommandoen,

Java Dir1/TheClass

skal visstnok fungere, men det fungerte ikke. Etter forfatterens mening er det virkelige problemet i denne situasjonen med Java -språket og ikke programmereren.

NoclassDeffoundError i Java oppstår når Java Virtual Machine ikke er i stand til å finne en bestemt klasse ved kjøretid. Dette kan også skje i et løpsprogram - se nedenfor.

Vedtak

For å løse dette problemet, gå til katalogen, DIR1 og kjøre programmet derfra, med følgende kommandoer, på terminalen, fra brukerkatalogen:

CD Dir1
Java theclass

Manglende bytecodeklassescenario

I denne delen vil katalogbrukeren@vertsnavn: ~/dir1 $, brukes utelukkende. Tenk på følgende Java -program:

klasse aclass

offentlig klasse mainclass
public static void main (String [] args)
Aclass obj = new aclass ();

Anta at dette er i en fil og lagret med navnet, mainclass.java i katalogen, bruker@hostname: ~/dir1 $. Følgende kommando vil kompilere filen:

bruker@hostname: ~/dir1 $ javac mainclass.Java

Resultatet vil være to filer, mainclass.Java og Mainclass.klasse, i samme katalog, DIR1. Mainclass.Java er kildefilen og mainclass.Klasse er bytecode -filen. For å kjøre et program i Java, er det byte -kodefilen som kjøres. Følgende kommando på terminalen vil kjøre programmet:

bruker@hostname: ~/dir1 $ java mainclass

Noter det ".klasse ”er ikke skrevet, selv om det er filen som er engasjert. Det skal ikke være noen utdata fordi det ikke er noen utskriftskommando i programmet. Det skal bare være den nye ledeteksten, noe som indikerer at mainclass -klassen har utført programmet med hell. Det er slik Java fungerer.

Å ha klassene som to filpar

Ovennevnte to klasser kan lagres som to forskjellige kildefiler, med navnene, ACLASS.Java og Theclass.Java. En klasse.Java ville ha koden for ACLASS og Theclass.Java ville ha koden for mainclass, med sitt filnavn omdøpt til Theclass.

Når disse to filene er i samme katalog, DIR1, bare TheClass.Java må være i kompilasjonskommandoen. Det ville integrere aclass.Java . Følgende kommando er tilstrekkelig:

Bruker@Hostname: ~/Dir1 $ Javac theClass.Java

I katalogen, DIR1, vil to nye filer resultere: TheClass.klasse og aclass.klasse . Dette er bytecode -filer. Klassen.Klassen tilsvarer TheClass.Java og Aclass.Klassen tilsvarer TheClass.klasse.

Nå, for å kjøre programmet, er det bare theclass.Klassefil må kommanderes (uten utvidelsen, ".klasse"). Den vil integrere bytecode -filen, ACLASS.klasse. Følgende kommando er nok til å kjøre klassen:

bruker@hostname: ~/dir1 $ java theclass

Som før er det ingen produksjon. Den nye ledeteksten skal vises, og viser at programmet er utført med hell.

NoclassDeffoundError i Java oppstår når Java Virtual Machine ikke er i stand til å finne en bestemt klasse ved kjøretid. Dette kan også skje i et løpsprogram, som det er illustrert i denne delen.

Nå, aclass.Klasse er en integrert del av plassen.klasse. Med andre ord, teclass.Klasse kan ikke løpe uten ACLASS.klasse. Så hvis aclass.Klassen blir slettet eller omdøpt, NoclassDeffoundError vil bli kastet. Terminalfeilvisningen, for kommandoen ovenfor, ville være:

Unntak i tråden "Main" Java.lang.NoclassDeffoundError: ACLASS
på Theclass.Hoved (TheClass.Java: 9)
Forårsaket av: java.lang.ClassNotFoundException: ACLASS
hos Java.base/jdk.innvendig.laster.BuiltinClassLoader.LoadClass (BuiltInclassLoader.Java: 581)
hos Java.base/jdk.innvendig.laster.Classloaders $ AppClassLoader.LoadClass (Classloaders.Java: 178)
hos Java.base/java.lang.Klasselaster.LoadClass (ClassLoader.Java: 522)
… 1 til

Vedtak

Dette problemet kan løses som følger: Hvis ACLASS.Klassen ble overført bort fra katalogen, den skulle bringes tilbake. Hvis det ble slettet, forutsatt at ACLASS.Java og Aclass.Java ble ikke slettet, da må programmet bare bli kompilert, med

Bruker@Hostname: ~/Dir1 $ Javac theClass.Java

og en ny aclass.Klasse i katalogen, Dir1, vil bli opprettet. Og kommandoen,

bruker@hostname: ~/dir1 $ java theclass

ville ikke utstede den ovennevnte lange feilmeldingen for NoclassDeffoundError.

Muligheten for å komme seg

NoclassDeffoundError er en runtime -feil, så det er egentlig ikke opp til programmereren å komme seg etter den. Som forklart ovenfor, er den beste måten å håndtere problemet ved oppløsning.

Konklusjon

I javaen.lang.* Pakke, det er en klasse som heter NoclassDeffoundError. Enhver klasses beskrivelse er klassens definisjon. NoclassDeffoundError står for ingen klassedefinisjon funnet feil. Dette kastes når forekomsten av Java Virtual Machine (JVM) eller en klasselaster prøver å laste inn definisjonen av en klasse, men ingen definisjon av klassen ble funnet.

NoclassDeffoundError er en runtime -feil, så det er egentlig ikke opp til programmereren å komme seg etter den. Den beste måten å håndtere problemet på er ved oppløsning: Bruk kommandolinjekommandoen til å utføre kommandoen i katalogen av interesse. Erstatt noen .klassefil; Det var ikke der det skulle være.