Kan hoofdklassefout niet vinden of laden
1. Inleiding
Af en toe wanneer we een Java-programma draaien, kunnen we zien "Kon hoofdklasse niet vinden of laden". De reden is gemakkelijk te raden: de JVM kon de hoofdklasse niet vinden en gaf deze foutmelding. Maar waarom kon het niet?
In deze tutorial bespreken we de mogelijke redenen waarom de hoofdklasse niet kan worden gevonden. We zullen ook zien hoe u ze kunt oplossen.
2. Voorbeeldprogramma
We beginnen met een Hallo Wereld programma:
openbare klasse HelloWorld {openbare statische leegte hoofd (String [] args) {System.out.println ("Hallo wereld .. !!!"); }}
Laten we het nu compileren:
$ javac HelloWorld.java
Hier genereert de compiler een .klasse bestand voor ons programma. Dit .klasse bestand wordt in dezelfde map gegenereerd. De .klasse -bestand heeft dezelfde naam als de klassenaam die in het Java-programma is opgegeven. Dit .klasse bestand is uitvoerbaar.
In de volgende secties zullen we dit uitvoeren .klasse bestand en probeer de waarschijnlijke redenen voor de fout "Kon hoofdklasse niet vinden of laden" te begrijpen.
3. Verkeerde klassenaam
Om een .klasse bestand gegenereerd door Java-compiler, kunnen we het onderstaande commando gebruiken:
Java
Laten we nu ons programma uitvoeren:
$ java helloworld Fout: Kan hoofdklasse helloworld niet vinden of laden
Ja, het is mislukt met de fout "Kon hoofdklasse helloworld niet vinden of laden".
Zoals eerder besproken, de compiler genereert het .klasse bestand met exact dezelfde naam die is gegeven aan de Java-klasse in het programma. Dus in ons geval krijgt de hoofdklasse de naam Hallo Wereld, niet Hallo Wereld.
Laten we het nog een keer proberen met de juiste behuizing:
$ java HelloWorld Hallo wereld .. !!!
Deze keer liep het met succes.
3.1. Bestandsextensie
Om een Java-programma te compileren, moeten we de bestandsnaam met de extensie (.Java):
$ javac HelloWorld.java
Maar om een.klasse bestand, moeten we de klassenaam opgeven, niet de bestandsnaam. Het is dus niet nodig om het .klasse uitbreiding:
$ java HelloWorld.class Fout: Kan hoofdklasse HelloWorld.class niet vinden of laden
Dus, nogmaals, laten we ons programma uitvoeren met de juiste klassenaam:
$ java HelloWorld Hallo wereld .. !!!
4. Namen van Java-pakketten
In Java houden we vergelijkbare klassen bij elkaar in wat we een pakket.
Laten we verder gaan Hallo Wereld klasse in de com.baeldung pakket:
pakket com.baeldung; openbare klasse HelloWorld {openbare statische leegte hoofd (String [] args) {System.out.println ("Hallo wereld .. !!!"); }}
Laten we nu het bijgewerkte Hallo Wereld programma zoals eerder:
$ java HelloWorld Fout: Kan hoofdklasse HelloWorld niet vinden of laden
Maar opnieuw krijgen we de foutmelding "Kon hoofdklasse HelloWorld niet vinden of laden"!
Laten we proberen te begrijpen wat we hier hebben gemist.
Om een Java-klasse uit een pakket te draaien, moeten we de volledig gekwalificeerde naam opgeven. Dus in ons geval HalloWereld volledig gekwalificeerde naam is com.baeldung.HelloWorld.
Nu, toen we creëerden com.baeldung pakket, hebben we eigenlijk een mappenstructuur gemaakt zoals:
com / baeldung / HelloWorld.java
Laten we eerst proberen ons programma uit te voeren vanuit het com / baeldung directory:
$ java com.baeldung.HelloWorld Fout: Kan hoofdklasse com.baeldung.HelloWorld niet vinden of laden
Toch kunnen we ons programma niet uitvoeren.
Hier, toen we de volledig gekwalificeerde klassenaam specificeerden com.baeldung.HelloWorld, Java probeerde het HelloWorld.class-bestand te vinden in com / baeldung, onder de directory van waaruit we het programma draaiden.
Omdat we al binnen waren com / baeldung, Java kon het Hallo Wereld programma.
Laten we nu teruggaan naar de bovenliggende map en deze uitvoeren:
$ java com.baeldung.HelloWorld Hallo wereld .. !!!
Ja, we kunnen weer "hallo" zeggen tegen de wereld.
5. Ongeldig klassenpad
Laten we, voordat we verder gaan, eerst begrijpen wat het klassenpad is - het is de set klassen die beschikbaar is voor onze momenteel draaiende JVM.
We gebruiken de classpath-variabele om de JVM te vertellen waar het .klasse bestanden op het bestandssysteem.
Tijdens het uitvoeren van een programma kunnen we het klassenpad opgeven met behulp van -klassenpad keuze. voorbeeld:
java -classpath / my_programs / compiled_classes HelloWorld
Hier zoekt Java naar HelloWorld.class bestand in /my_programs / compiled_classes map, een map waarvan we de naam zojuist hebben verzonnen. Standaard, de classpath-variabele is ingesteld op ".", wat de huidige directory betekent.
In het bovenstaande gedeelte hebben we onze directory gewijzigd om ons programma uit te voeren. Maar wat als we het vanuit een andere map willen uitvoeren? Dat is wanneer de classpath-variabele ons helpt.
Om ons programma vanuit de directory uit te voeren is com / baeldung we kunnen eenvoudig stellen dat ons klassenpad twee mappen omhoog is - één voor elk pakketdeel:
$ java -claspath ../../ com.baeldung.HelloWorld Hallo wereld .. !!!
Hier staat ".." voor de bovenliggende directory. In ons geval vertegenwoordigt "../../" de top van onze pakkethiërarchie.
6. Conclusie
In deze tutorial hebben we de waarschijnlijke redenen voor de fout "Kon hoofdklasse niet vinden of laden" geleerd.
Vervolgens hebben we natuurlijk ook geleerd hoe we deze fout kunnen oplossen.