Computer >> Máy Tính >  >> Lập trình >> Java

Tại sao chúng ta nhận được ClassNotFoundException khi lớp tồn tại trong Java?

Bất cứ khi nào chúng tôi cố gắng tải một lớp, nếu trình tải lớp không thể tìm thấy lớp tại đường dẫn được chỉ định, thì ClassNotFoundException được tạo.

Điều này có thể xảy ra khi thực thi chương trình java, tải một lớp một cách rõ ràng bằng cách sử dụng forName () phương thức của lớp có tên Lớp hoặc loadClass () phương thức của lớp ClassLoader. Hai lớp này chấp nhận các giá trị chuỗi đại diện cho tên lớp và tải các lớp được chỉ định.

Trong khi chuyển tên lớp cho các phương thức này, bạn cần đảm bảo rằng -

  • Tên lớp bạn chuyển cho các phương thức này phải chính xác.

  • Lớp được chỉ định (cùng với gói) phải nằm trong thư mục hiện tại hoặc đường dẫn của nó phải được liệt kê trong classpath biến môi trường.

Ví dụ

Giả sử chúng tôi đã tạo một lớp có tên Mẫu trong thư mục D:// và được biên dịch như hình bên dưới -

package myPackage.example;
public class Sample {
   static {
      System.out.println("The class named Sample loaded successfully.........");
   }
}

Tổng hợp

D:\>javac -d . Sample.java

Thao tác này sẽ tạo một gói trong thư mục hiện tại myPackage.example và tạo .class tệp của Mẫu đẳng cấp trong đó. Do đó, trong khi tải lớp này, bạn cần đặt nó trong cùng một thư mục và chuyển tên lớp tuyệt đối cho Class.forName () hoặc loadClass ()

Ví dụ

public class ClassNotFoundExample {
   public static void main(String args[]) {
      try {
         Class.forName("myPackage.exampl.Sample");
      }catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }
}

Ngoại lệ

Khi thực hiện chương trình trên, vì tên của gói bị viết sai chính tả, bạn sẽ nhận được ngoại lệ sau.

D:\>java ClassNotFoundExample
java.lang.ClassNotFoundException: myPackage.exampl.Sample
   at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
   at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.Class.forName0(Native Method)
   at java.base/java.lang.Class.forName(Unknown Source)
   at ClassNotFoundExample.main(ClassNotFoundExample.java:4)

Nếu bạn đang cố gắng truy cập một lớp cụ thể từ một thư mục khác, bạn cần đặt đường dẫn lớp cho -

  • Thư mục (ngoài cùng gói nhất) chứa tệp .class.

    hoặc,

  • Tệp jar chứa lớp.

Giả sử, chúng tôi đã khắc phục sự cố chính tả và cố gắng tải lớp từ tệp Java nằm trong thư mục E://

Ví dụ

public class ClassNotFoundExample {
   public static void main(String args[]) {
      try {
         Class.forName("myPackage.example.Sample");
      }catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }
}

Ngoại lệ

Bạn vẫn nhận được cùng một ngoại lệ vì gói chứa tệp .class của lớp được chỉ định (hoặc tệp jar chứa nó) không có trong thư mục hiện tại cũng như trong danh sách các đường dẫn trong classpath biến môi trường.

E:\>java ClassNotFoundExample
java.lang.ClassNotFoundException: myPackage.example.Sample
   at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
   at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.Class.forName0(Native Method)
   at java.base/java.lang.Class.forName(Unknown Source)
   at ClassNotFoundExample.main(ClassNotFoundExample.java:4)

Trong kịch bản hiện tại, hãy đặt đường dẫn lớp đến thư mục chứa gói chứa lớp bắt buộc, tức là “ D:// ”Và thực thi chương trình java ở trên để làm cho nó hoạt động.

E:\>javac ClassNotFoundExample.java
E:\>java ClassNotFoundExample
The class named Sample loaded successfully.........