Kunne ikke finde eller indlæse hovedklassefejl

1. Introduktion

Lejlighedsvis når vi kører et Java-program, ser vi muligvis "Kunne ikke finde eller indlæse hovedklasse". Det er let at gætte årsagen: JVM kunne ikke finde hovedklassen og gav denne fejl. Men hvorfor kunne det ikke?

I denne vejledning diskuterer vi de sandsynlige årsager til, at hovedklassen ikke findes. Vi vil også se, hvordan vi løser dem.

2. Prøveprogram

Vi starter med en Hej Verden program:

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

Lad os nu sammensætte det:

$ javac HelloWorld.java

Her genererer compileren en .klasse fil til vores program. Det her .klasse fil genereres i samme bibliotek. Det .klasse filen har samme navn som klassens navn, der er angivet i Java-programmet. Det her .klasse filen er eksekverbar.

I de følgende afsnit kører vi dette .klasse fil og prøv at forstå de sandsynlige årsager til fejlen “Kunne ikke finde eller indlæse hovedklasse”.

3. Forkert klassenavn

At køre en .klasse fil genereret af Java compiler, kan vi bruge kommandoen nedenfor:

java 

Lad os nu køre vores program:

$ java helloworld Fejl: Kunne ikke finde eller indlæse hovedklassen helloworld

Ja, det mislykkedes med fejlen "Kunne ikke finde eller indlæse hovedklasse helloworld".

Som diskuteret tidligere, compileren genererer .klasse fil med nøjagtigt det samme navn, der er givet til Java-klassen i programmet. Så i vores tilfælde vil hovedklassen have navnet Hej Verden, ikke Hej Verden.

Lad os prøve det mere med korrekt beklædning:

$ java HelloWorld Hej verden .. !!!

Denne gang kørte det med succes.

3.1. Filudvidelse

For at kompilere et Java-program skal vi give filnavnet med dets udvidelse (.java):

$ javac HelloWorld.java

Men at køre en.klasse fil, skal vi angive klassens navn, ikke filnavnet. Så der er ingen grund til at levere .klasse udvidelse:

$ java HelloWorld.class Fejl: Kunne ikke finde eller indlæse hovedklassen HelloWorld.class

Så igen, lad os køre vores program ved hjælp af det rigtige klassenavn:

$ java HelloWorld Hej verden .. !!!

4. Navn på Java-pakker

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

Lad os flytte Hej Verden klasse ind i com.baeldung pakke:

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

Lad os nu kompilere og køre det opdaterede Hej Verden program som før:

$ java HelloWorld-fejl: Kunne ikke finde eller indlæse hovedklassen HelloWorld

Men igen får vi fejlen "Kunne ikke finde eller indlæse hovedklasse HelloWorld"!

Lad os prøve at forstå, hvad vi gik glip af her.

For at køre en Java-klasse, der er i en pakke, skal vi angive dens fuldt kvalificerede navn. Så i vores tilfælde HelloWorld's fuldt kvalificeret navn er com.baeldung.HelloWorld.

Nu, da vi skabte com.baeldung pakke oprettede vi faktisk en mappestruktur som:

com / baeldung / HelloWorld.java

Lad os først køre vores program fra com / baeldung vejviser:

$ java com.baeldung.HelloWorld Fejl: Kunne ikke finde eller indlæse hovedklasse com.baeldung.HelloWorld

Alligevel er vi ikke i stand til at køre vores program.

Her, da vi specificerede det fuldt kvalificerede klassenavn com.baeldung.HelloWorld, Java forsøgte at finde HelloWorld.class-filen i com / baeldungunder den mappe, hvorfra vi kørte programmet.

Da vi allerede var inde com / baeldung, Java kunne ikke finde og køre Hej Verden program.

Lad os nu gå tilbage til den overordnede mappe og køre den:

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

Ja, vi er igen i stand til at sige “Hej” til verden.

5. Ugyldig klassesti

Lad os først forstå, hvad der er klassestien, inden vi går videre - det er det sæt klasser, der er tilgængeligt for vores nuværende JVM.

Vi bruger classpath-variablen til at fortælle JVM, hvor den skal findes .klasse filer på filsystemet.

Mens vi kører et program, kan vi give klassestien ved hjælp af -klassesti mulighed. eksempel:

java -classpath / my_programs / compiled_classes HelloWorld

Her vil Java se efter HelloWorld.class arkiv i /my_programs / compiled_classes mappe, en mappe hvis navn vi lige har sammensat. Som standard, classpath-variablen er indstillet til “.”, hvilket betyder den aktuelle mappe.

I ovenstående afsnit ændrede vi vores bibliotek for at køre vores program. Men hvad hvis vi vil køre det fra en anden mappe? Det er her, classpath-variablen hjælper os.

At køre vores program fra biblioteket er com / baeldung Vi kan ganske enkelt sige, at vores klassesti er to mapper op - en for hver pakke del:

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

Her repræsenterer “..” den overordnede mappe. I vores tilfælde repræsenterer “../../” toppen af ​​vores pakkehierarki.

6. Konklusion

I denne vejledning lærte vi de sandsynlige årsager til fejlen "Kunne ikke finde eller indlæse hovedklasse".

Derefter lærte vi selvfølgelig også, hvordan vi løser denne fejl.