Nu s-a putut găsi sau încărca eroarea clasei principale

1. Introducere

Ocazional, când rulăm un program Java, este posibil să vedem „Nu am putut găsi sau încărca clasa principală”. Este ușor de ghicit motivul: JVM nu a reușit să găsească clasa principală și a dat această eroare. Dar de ce nu a putut?

În acest tutorial, vom discuta motivele probabile ale eșecului de a găsi clasa principală. De asemenea, vom vedea cum să le remediem.

2. Exemplu de program

Vom începe cu un program HelloWorld :

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

Acum, să-l compilăm:

$ javac HelloWorld.java

Aici, compilatorul va genera un fișier .class pentru programul nostru. Acest fișier .class va fi generat în același director. Fișierul .class va avea același nume ca numele clasei dat în programul Java. Acest fișier .class este executabil.

În secțiunile următoare, vom rula acest fișier .class și vom încerca să înțelegem motivele probabile ale erorii „Nu am putut găsi sau încărca clasa principală”.

3. Numele clasei greșite

Pentru a rula un fișier .class generat de compilatorul Java, putem folosi comanda de mai jos:

java 

Acum, să rulăm programul nostru:

$ java helloworld Error: Could not find or load main class helloworld

Da, a eșuat cu eroarea „Nu am putut găsi sau încărca clasa principală helloworld”.

După cum sa discutat mai devreme, compilatorul va genera fișierul .class cu exact același nume dat clasei Java din program . Deci, în cazul nostru, clasa principală va avea numele HelloWorld , nu helloworld .

Să mai încercăm o dată cu carcasa corectă:

$ java HelloWorld Hello world..!!!

De data aceasta a rulat cu succes.

3.1. Extensie fișier

Pentru a compila un program Java, trebuie să furnizăm numele fișierului cu extensia sa (. Java ):

$ javac HelloWorld.java

Dar pentru a rula un. fișierul clasei , trebuie să furnizăm numele clasei, nu numele fișierului. Deci, nu este necesar să furnizați extensia .class :

$ java HelloWorld.class Error: Could not find or load main class HelloWorld.class

Deci, din nou, să rulăm programul nostru folosind numele corect al clasei:

$ java HelloWorld Hello world..!!!

4. Numele pachetelor Java

În Java, păstrăm clase similare împreună în ceea ce numim un pachet .

Să mutăm clasa HelloWorld în pachetul com.baeldung :

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

Acum, să compilăm și să rulăm programul HelloWorld actualizat ca înainte:

$ java HelloWorld Error: Could not find or load main class HelloWorld

Dar din nou primim eroarea „Nu am putut găsi sau încărca clasa principală HelloWorld”!

Să încercăm să înțelegem ce ne-a scăpat aici.

Pentru a rula o clasă Java care se află într-un pachet, trebuie să îi furnizăm numele complet calificat . Deci, în cazul nostru, numele complet calificat al HelloWorld este com.baeldung.HelloWorld .

Acum, când am creat pachetul com.baeldung , am creat de fapt o structură de dosare precum:

com/baeldung/HelloWorld.java

Mai întâi, să încercăm să rulăm programul nostru din directorul com / baeldung :

$ java com.baeldung.HelloWorld Error: Could not find or load main class com.baeldung.HelloWorld

Totuși, nu putem rula programul nostru.

Aici, când am specificat numele de clasă complet calificat com.baeldung.HelloWorld , Java a încercat să găsească fișierul HelloWorld.class în com / baeldung , sub directorul de unde rulam programul.

Deoarece eram deja în com / baeldung , Java nu a reușit să găsească și să ruleze programul HelloWorld .

Acum, să ne întoarcem în dosarul părinte și să-l rulăm:

$ java com.baeldung.HelloWorld Hello world..!!!

Da, suntem din nou capabili să spunem „Bună ziua” lumii.

5. Classpath nevalid

Înainte de a merge mai departe, să înțelegem mai întâi ce este clasa - este setul de clase disponibile pentru JVM-ul nostru care rulează în prezent.

Folosim variabila classpath pentru a spune JVM unde să găsească fișierele .class din sistemul de fișiere.

În timp ce rulăm un program, putem oferi opțiunea classpath folosind opțiunea -classpath . exemplu:

java -classpath /my_programs/compiled_classes HelloWorld

Aici, Java va căuta fișierul HelloWorld.class în folderul / my_programs / compiled_classes , un folder al cărui nume tocmai l-am alcătuit. În mod implicit, variabila classpath este setată la „.”, Adică directorul curent.

În secțiunea de mai sus, ne-am schimbat directorul pentru a rula programul nostru. Dar dacă vrem să-l rulăm dintr-un alt folder? Atunci ne ajută variabila classpath.

Pentru a rula programul nostru din directorul este com / baeldung , putem afirma pur și simplu că classpath-ul nostru are două directoare în sus - unul pentru fiecare parte a pachetului:

$ java -claspath ../../ com.baeldung.HelloWorld Hello world..!!!

Aici, „..” reprezintă directorul părinte. În cazul nostru, „../../” reprezintă partea de sus a ierarhiei noastre de pachete.

6. Concluzie

În acest tutorial, am aflat motivele probabile ale erorii „Nu am putut găsi sau încărca clasa principală”.

Apoi, desigur, am învățat și cum să rezolvăm această eroare.