Kunne ikke finne eller laste inn hovedklassfeil

1. Introduksjon

Noen ganger når vi kjører et Java-program, ser vi kanskje "Kunne ikke finne eller laste inn hovedklasse". Det er lett å gjette årsaken: JVM klarte ikke å finne hovedklassen og ga denne feilen. Men hvorfor kunne det ikke?

I denne opplæringen vil vi diskutere de sannsynlige årsakene til at du ikke finner hovedklassen. Vi får også se hvordan vi fikser dem.

2. Prøveprogram

Vi begynner med en Hei Verden program:

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

La oss nå kompilere det:

$ javac HelloWorld.java

Her vil kompilatoren generere en .klasse fil for programmet vårt. Dette .klasse filen blir generert i samme katalog. De .klasse filen vil ha samme navn som klassenavnet gitt i Java-programmet. Dette .klasse filen er kjørbar.

I de følgende avsnittene kjører vi dette .klasse fil og prøv å forstå de sannsynlige årsakene til feilen "Kunne ikke finne eller laste inn hovedklasse".

3. Feil klassenavn

Å kjøre en .klasse fil generert av Java kompilator, kan vi bruke kommandoen nedenfor:

java 

La oss nå kjøre programmet vårt:

$ java helloworld Feil: Kunne ikke finne eller laste inn hovedklassen helloworld

Ja, det mislyktes med feilen "Kunne ikke finne eller laste hovedklasse helloworld".

Som diskutert tidligere, kompilatoren vil generere .klasse filen med nøyaktig samme navn gitt til Java-klassen i programmet. Så i vårt tilfelle vil hovedklassen ha navnet Hei Verden, ikke Hei Verden.

La oss prøve det til med riktig foringsrør:

$ java HelloWorld Hei verden .. !!!

Denne gangen gikk det vellykket.

3.1. Filutvidelse

For å kompilere et Java-program, må vi oppgi filnavnet med filtypen (.java):

$ javac HelloWorld.java

Men å kjøre en.klasse fil, må vi oppgi klassenavnet, ikke filnavnet. Så det er ikke nødvendig å gi .klasse Utvidelse:

$ java HelloWorld.class Feil: Kunne ikke finne eller laste inn hovedklassen HelloWorld.class

Så igjen, la oss kjøre programmet vårt med riktig klassenavn:

$ java HelloWorld Hello world .. !!!

4. Navn på Java-pakker

I Java holder vi lignende klasser sammen i det vi kaller a pakke.

La oss gå Hei Verden klasse inn i com.baeldung pakke:

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

La oss nå kompilere og kjøre det oppdaterte Hei Verden program som før:

$ java HelloWorld-feil: Kunne ikke finne eller laste hovedklassen HelloWorld

Men igjen får vi feilen "Kunne ikke finne eller laste hovedklasse HelloWorld"!

La oss prøve å forstå hva vi savnet her.

For å kjøre en Java-klasse som er i en pakke, må vi oppgi det fullstendige navnet. Så i vårt tilfelle, HelloWorld's fullt kvalifisert navn er com.baeldung.HelloWorld.

Nå, da vi skapte com.baeldung pakke, opprettet vi faktisk en mappestruktur som:

com / baeldung / HelloWorld.java

La oss først prøve å kjøre programmet vårt fra com / baeldung katalog:

$ java com.baeldung.HelloWorld Feil: Kunne ikke finne eller laste hovedklasse com.baeldung.HelloWorld

Likevel klarer vi ikke å kjøre programmet vårt.

Her, når vi spesifiserte det fullt kvalifiserte klassenavnet com.baeldung.HelloWorld, Java prøvde å finne HelloWorld.class-filen i com / baeldung, under katalogen der vi kjørte programmet.

Som vi allerede var inne com / baeldung, Java klarte ikke å finne og kjøre Hei Verden program.

La oss nå gå tilbake til den overordnede mappen og kjøre den:

$ java com.baeldung.HelloWorld Hallo verden .. !!!

Ja, vi er igjen i stand til å si "Hei" til verden.

5. Ugyldig klassesti

Før vi går videre, la oss først forstå hva som er klassestien - det er settet med klasser tilgjengelig for vår for tiden kjørende JVM.

Vi bruker classpath-variabelen for å fortelle JVM hvor du finner .klasse filer på filsystemet.

Mens du kjører et program, kan vi tilby klassestien ved hjelp av -klassesti alternativ. eksempel:

java -classpath / my_programs / compiled_classes HelloWorld

Her vil Java se etter HelloWorld.class arkiv i /my_programs / compiled_classes mappe, en mappe hvis navn vi nettopp har laget. Som standard, classpath-variabelen er satt til “.”, som betyr den nåværende katalogen.

I avsnittet ovenfor endret vi katalogen vår for å kjøre programmet vårt. Men hva om vi vil kjøre den fra en annen mappe? Det er da classpath-variabelen hjelper oss.

Å kjøre programmet vårt fra katalogen er com / baeldung vi kan ganske enkelt slå fast at klassestien vår er to kataloger opp - en for hver pakkedel:

$ java -claspath ../../ com.baeldung.HelloWorld Hei verden .. !!!

Her representerer “..” den overordnede katalogen. I vårt tilfelle representerer “../../” toppen av pakkehierarkiet vårt.

6. Konklusjon

I denne opplæringen lærte vi de sannsynlige årsakene til feilen "Kunne ikke finne eller laste hovedklasse".

Så lærte vi selvfølgelig også hvordan vi skulle løse denne feilen.