Lỗi «Could not find or load main class» xảy ra khi sử dụng lệnh java trong command prompt để khởi chạy chương trình Java bằng cách chỉ định tên lớp trong terminal. Lý do tại sao điều này xảy ra chủ yếu do lỗi lập trình của người dùng khi khai báo lớp.

Như đã đề cập trước đó, lỗi này chủ yếu không liên quan đến hệ thống và người dùng mắc lỗi trong một số tình huống như được hiển thị dưới đây. Trước khi tiến hành, chúng tôi giả định bạn có kiến thức cơ bản về ngôn ngữ lập trình Java và cách nó hoạt động.
Nguyên nhân gây ra lỗi «Could not find or load main class» trong Java?
Thông báo «Could not find or load main class» có nghĩa là bước đầu tiên của công cụ Java lấy lớp để thực thi đã thất bại. Lệnh java không thể tìm thấy lớp tại thư mục đúng.
Trong một số trường hợp, bạn phải thêm đường dẫn tệp chính xác và trỏ terminal Java đến vị trí chính xác. Vì bạn đang thực thi lệnh từ terminal dòng lệnh, máy tính không biết lớp ở đâu để tìm hoặc nó nằm ở đâu. Trong các IDE nhắm mục tiêu, đây không phải là vấn đề vì IDE giữ một con trỏ trỏ về thư mục làm việc hiện tại.
Cú pháp «java <class-name>» là gì?
Trước khi chúng ta bắt đầu khắc phục sự cố tại sao terminal trả về lỗi khi cố gắng thực thi, trước tiên chúng ta cần nhìn vào cú pháp của lệnh. Nếu bạn không sử dụng cú pháp đúng, bạn sẽ không thể tránh khỏi lỗi này.
Cú pháp bình thường của lệnh giống như sau:
java [ <option> ... ] <class-name> [<argument> ...]
Ở đây <option> là tùy chọn dòng lệnh, <class-name> là tên lớp Java đủ điều kiện, và <argument> là đối số dòng lệnh được truyền cho ứng dụng của bạn khi toàn bộ gói được biên dịch.
Một ví dụ lệnh hợp lệ là:
java -Xmx100m com.acme.example.ListAppuals kevin arrows bart
Lệnh trên sẽ khiến lệnh java thực hiện các thao tác sau:
- Nó sẽ tìm phiên bản đã biên dịch của lớp «com.acme.example.ListAppuals».
- Sau khi tìm thấy, nó sẽ tải lớp.
- Tiếp theo, khi lớp được tải, lớp sẽ được tìm kiếm phương thức «main» với chữ ký hợp lệ, modifier và kiểu trả về. Một lớp main mẫu sẽ giống như:
public static void main(String[])
- Phương thức sẽ được gọi với đối số «kevin», «arrows» và «bart» dưới dạng string[].
Cách khắc phục «Could not find or load main class»
Giải pháp 1: Kiểm tra đối số tên lớp
Lỗi phổ biến nhất người dùng mắc là họ cung cấp tên lớp sai làm đối số (hoặc tên lớp đúng nhưng sai形式). Vì chúng ta đang khai báo tham số trên dòng lệnh, rất có khả năng bạn sẽ truyền đối số tên lớp sai形式. Ở đây chúng tôi sẽ liệt kê tất cả các tình huống có thể bạn có thể mắc lỗi.
- Viết tên lớp đơn giản. Nếu bạn khai báo lớp trong một gói như «com.acme.example», bạn phải sử dụng tên lớp đầy đủ bao gồm gói trong lệnh Java.
java com.acme.example.ListAppuals
thay vì
java ListAppuals
- Bạn nên khai báo tên lớp thay vì khai báo tên tệp hoặc đường dẫn. Java không tải lớp nếu bạn khai báo pathname/filename cho nó. Các mục không chính xác bao gồm:
java ListAppuals.class java com/acme/example/ListAppuals.class
- Chữ hoa/chữ thường nên được xem xét. Lệnh Java phân biệt chữ hoa chữ thường và nếu bạn mắc lỗi chỉ một chữ cái, bạn sẽ không thể tải lớp main. Ví dụ lỗi không chính xác là:
java com.acme.example.listappuals
- Bạn không nên khai báo tên tệp nguồn. Như đã đề cập trước đó, bạn chỉ cần khai báo lớp ở định dạng tên lớp đầy đủ đúng. Ví dụ lỗi là:
java ListAppuals.java
- Lỗi này cũng sẽ xảy ra nếu bạn mắc lỗi đánh máy hoặc quên viết tên lớp hoàn toàn.
Nếu bạn đã mắc bất kỳ lỗi cẩu thả nào trong khai báo tên lớp, hãy đảm bảo bạn khắc phục nó và sau đó thử khởi chạy chương trình.
Giải pháp 2: Kiểm tra classpath
Nếu bạn đã khai báo tên lớp đúng nhưng vẫn thấy lỗi, có khả năng lệnh java không tìm thấy tên lớp được chỉ định tại đường dẫn. Classpath là đường dẫn nơi Java runtime tìm kiếm tài nguyên và tệp lớp. Bạn có thể dễ dàng đặt classpath bằng hai lệnh khác nhau như được hiển thị dưới đây:
C:> sdkTool -classpath classpath1;classpath2... C:> set CLASSPATH=classpath1;classpath2...
Để có thêm hiểu biết về classpath, bạn nên xem các tài liệu sau.
Tài liệu lệnh Java
Thiết lập classpath
Giải pháp 3: Kiểm tra thư mục
Khi bạn khai báo một thư mục làm classpath, nó sẽ luôn tương ứng với gốc của namespace. Ví dụ nếu «/usr/local/acme/classes» nằm trên classpath, thì Java sẽ tìm kiếm lớp «com.acme.example.Appuals». Nó sẽ tìm lớp với pathname sau:
/usr/local/acme/classes/com/acme/example/Appuals.class
Vì vậy về bản chất, nếu bạn đặt địa chỉ sau vào classpath, Java sẽ không thể tìm thấy lớp:
/usr/local/acme/classes/com/acme/example
Bạn cũng nên kiểm tra thư mục con của bạn và xem nó có khớp với FQN không. Nếu FQN của lớp bạn là «com.acme.example.Appuals», thì Java sẽ tìm «Appuals.class» trong thư mục «com/acme/example».
Để đưa ra ví dụ, hãy giả sử tình huống sau:
- Lớp bạn muốn chạy là: com.acme.example.Appuals
- Đường dẫn tệp đầy đủ là: /usr/local/acme/classes/com/acme/example/Appuals.class
- Thư mục làm việc hiện tại là: /usr/local/acme/classes/com/acme/example/
Sau đó các tình huống sau sẽ đúng:
# sai, cần FQN java Appuals # sai, không có thư mục `com/acme/example` trong thư mục làm việc hiện tại java com.acme.example.Appuals # sai, tương tự tình huống trên java -classpath . com.acme.example.Appuals # OK ; classpath tương đối được đặt java -classpath ../../.. com.acme.example.Appuals # OK; classpath tuyệt đối được đặt java -classpath /usr/local/acme/classes com.acme.example.Appuals
Lưu ý: Classpath cũng cần bao gồm tất cả các lớp khác (phi hệ thống) mà ứng dụng của bạn cần.
Giải pháp 4: Kiểm tra gói lớp
Nếu tất cả các giải pháp trên đúng trong trường hợp của bạn, bạn cần đảm bảo mã nguồn của bạn được đặt trong thư mục đúng. Ngoài ra, bạn đã khai báo gói (package) chính xác. Nếu bạn chạy mã với IDE, nó có thể sẽ thông báo cho bạn về vấn đề. Tuy nhiên, trong trường hợp của chúng ta, vì chúng ta đang chạy nó trong command prompt, lỗi sẽ không bị nhận thấy và bạn sẽ nhận được lỗi lớp đang thảo luận.