Om du fortsätter att få huvudklassen ej hittad-fel i ditt Java-projekt utan någon uppenbar anledning, oroa dig inte, du är inte ensam.
Som ett av de mest oförutsedda och spontana felen, tack vare JVM:s (Java Virtual Machine) tendens att hålla sig till en standardklassväg, är problemet med “huvudklassen ej hittad” något som förföljer både amatörer och proffs.
Men den här frågan är faktiskt mindre skrämmande än den verkar vara. Läs vidare för att ta reda på hur du kan bli av med detta fel en gång för alla.
Varför hittades inte huvudklassen?
Innan vi försöker förstå hur och varför JVM inte kunde hitta huvudklassen, måste vi förstå begreppet Klassväg i Java.
Vad är Classpath?
Klasssökvägen är den filsökväg som Java-runtimemiljön söker efter klasser och andra resursfiler. Den kan ställas in med antingen -klassväg alternativ när ett program körs eller genom att ställa in systemet KLASSVÄG miljöfaktor.
Som namnet antyder är det helt enkelt en filsökväg där .klass filer kan hittas i ett JDK-paket eller en katalog.
När JVM inte kan lokalisera huvudklassen beror det ofta på att den letar efter motsvarande .klass filer i fel klasssökväg. Naturligtvis, sättet att åtgärda detta problem är att manuellt specificera klasssökvägen genom att antingen använda paket eller ange klasssökvägen.
Vid det här laget, om du vill fräscha upp ditt minne av Java-klasser, kolla in vår guide för att skapa klasser i Java.
Använda paket
Låt oss skapa en klass som heter Testa. Lägg den i ett paket som heter testpaket. Paket används i Java för att gruppera liknande klasser eller ge ett unikt namnområde för klasser.
I det här enkla exemplet kommer ett paket att hjälpa dig att visualisera hur Javas klassväg fungerar. I ditt filhanterarprogram representeras ett paket som en oberoende mapp.
package testPackage;
public class Test {
public static void main(String args[]) {
System.out.println("File successfully found!");
}
}
Öppna nu en ny terminal och se till att din arbetskatalog är densamma som den som innehåller paketmappen. Du kan ändra arbetskatalogen genom att använda CD kommando på vilket operativsystem som helst.
Sammanställa Test.java genom att köra följande kommando:
package testPackage;
javac testPackage/Test.java
Detta kommer att spara den kompilerade binära filen (.class-filen) i testPackage.
För att köra den kompilerade klassen måste du skriva in det fullt kvalificerade klassnamnet på kommandoraden. En Java-klasss fullt kvalificerade namn hänvisar till dess namn med prefixet till dess paketnamn. I det här fallet bör detta se ut ungefär så här:
java testPackage.Test
Detta sätt att anropa klassfiler säkerställer också att du kan anropa körbara filer från olika paket från samma arbetskatalog. Allt du behöver göra är att ändra det fullt kvalificerade klassnamnet.
I mer avancerade implementeringar rekommenderar vi att du skapar separata undermappar för dina klasser och källfiler för att bättre hantera filer i paketet.
Ange klasssökväg manuellt
Det rekommenderade sättet att hantera dina java-filer är att skapa separata kataloger för källfiler och klasser. Om du arbetar med ett projekt är det troligt att du redan gör detta.
Traditionellt är katalogen med källfiler märkt som src och den med .class-filer är märkt som klasser. Detta är också ett sätt att säkerställa att sannolikheten för att JVM inte hittar huvudklassen minskar avsevärt, på grund av den korrekt strukturerade katalogen.
Om vi använder den här metoden kommer katalogstrukturen att se ut så här innan kompilering:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
Varje indrag i illustrationen ovan motsvarar en nivå i filhierarkin som ditt projekt ska följa.
För att kompilera detta, se till att din arbetskatalog är myFolder. Skriv nu följande kommando:
javac -d classes src/testPackage/Test.java
De .klass körbar fil ska sparas i myFolder/classes/testPackage. Följaktligen ser filkatalogstrukturen ut ungefär så här:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
| |---testPackage
| |---Test.class
Att köra .klass fil, kör Java-kommandot med det fullständiga klassnamnet och ange den lokala klasssökvägen. Varje sökväg deklareras i förhållande till arbetskatalogen, som i det här fallet är myFolder.
java -classpath classes testPackage
Att köra det här kommandot bör ge dig önskad utdata. Men varför krävs så mycket omorganisation för att lösa ett enkelt fel?
Vikten av att organisera filer i Java
Själva anledningen till att “Kunde inte hitta eller ladda huvudklassen” kastas är att JVM inte kunde hitta var din .klass filer lagrades.
Det enklaste sättet att lösa detta fel är att kontrollera var .class-filerna lagras och uttryckligen tala om för JVM att leta där. Detta görs möjligt genom att organisera dina källfiler och körbara filer separat och kontrollera allt från en arbetskatalog.
När du börjar lägga till konstruktioner som arv till ditt projekt, kommer filsystemets komplexitet att öka många gånger. I sådana projekt eller till och med de där användningen av JAR-filer eller anpassade bibliotek krävs, kan den enkla övningen att segregera och hantera filer spara dig otaliga timmar av felsökning och felsökning.
För att läsa mer om hur classpath fungerar i Java och de många saker du kan kontrollera när det kommer till att köra din kod, kan du också ta en titt på Oracles detaljerade och användarvänliga referens.
Om författaren
Yash Chellani (10 publicerade artiklar)
Yash är en blivande datavetenskapsstudent som älskar att bygga saker och skriva om allt som är tekniskt. I hans free tid, han gillar att spela squash, läsa en kopia av den senaste Murakami och jaga drakar i Skyrim.
Mer från Yash Chellani
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, free e-böcker och exklusiva erbjudanden!
Klicka här för att prenumerera
