Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

เหตุใดเราจึงได้รับ ClassNotFoundException เมื่อคลาสมีอยู่ใน Java


เมื่อใดก็ตามที่เราพยายามโหลดคลาส หากตัวโหลดคลาสไม่พบคลาสที่เส้นทางที่ระบุ ClassNotFoundException ถูกสร้างขึ้น

สิ่งนี้อาจเกิดขึ้นขณะรันโปรแกรมจาวา การโหลดคลาสอย่างชัดเจนโดยใช้ forName() เมธอดของคลาสชื่อ Class หรือ loadClass() วิธีการของคลาส ClassLoader ทั้งสองคลาสนี้ยอมรับค่าสตริงที่แสดงชื่อคลาสและโหลดคลาสที่ระบุ

ในขณะที่ส่งชื่อคลาสไปยังวิธีการเหล่านี้ คุณต้องแน่ใจว่า −

  • ชื่อคลาสที่คุณส่งไปยังเมธอดเหล่านี้ควรถูกต้อง

  • คลาสที่ระบุ (พร้อมกับแพ็คเกจ) ควรอยู่ในไดเร็กทอรีปัจจุบัน หรือพาธของคลาสนั้นควรแสดงรายการในตัวแปร classpath ของสภาพแวดล้อม

ตัวอย่าง

สมมติว่าเราได้สร้างคลาสชื่อ Sample ในไดเรกทอรี D:// และเรียบเรียงตามที่แสดงด้านล่าง −

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

รวบรวม

D:\>javac -d . Sample.java

สิ่งนี้จะสร้างแพ็คเกจในไดเรกทอรีปัจจุบัน myPackage.example และสร้าง .class ไฟล์ของ ตัวอย่าง ชั้นเรียนในนั้น ดังนั้น ขณะโหลดคลาสนี้ คุณต้องมีคลาสของคุณอยู่ในไดเร็กทอรีเดียวกัน และส่งชื่อคลาสแบบสัมบูรณ์ไปที่ Class.forName() หรือ loadClass()

ตัวอย่าง

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

ข้อยกเว้น

ในการดำเนินการโปรแกรมข้างต้น เนื่องจากชื่อของแพ็คเกจสะกดผิด คุณจะได้รับข้อยกเว้นดังต่อไปนี้

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)

หากคุณกำลังพยายามเข้าถึงคลาสใดคลาสหนึ่งจากไดเร็กทอรีอื่น คุณต้องตั้งค่าพาธคลาสสำหรับ -

  • โฟลเดอร์ (นอกแพ็คเกจส่วนใหญ่) ที่มีไฟล์ .class

    หรือ

  • ไฟล์ jar ที่มีคลาส

สมมติว่าเราได้แก้ไขปัญหาการสะกดคำแล้วและพยายามโหลดคลาสจากไฟล์ Java ซึ่งอยู่ในไดเร็กทอรี E://

ตัวอย่าง

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

ข้อยกเว้น

คุณยังคงได้รับข้อยกเว้นเช่นเดียวกัน เนื่องจากแพ็กเกจที่มีไฟล์ .class ของคลาสที่ระบุ (หรือไฟล์ jar ที่มีไฟล์ดังกล่าว) ไม่ได้อยู่ในไดเร็กทอรีปัจจุบันหรือในรายการพาธในตัวแปรสภาพแวดล้อมของ classpath

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)

ในสถานการณ์ปัจจุบัน ให้ตั้งค่าพาธของคลาสไปยังไดเร็กทอรีที่มีแพ็กเกจที่มีคลาสที่ต้องการ เช่น “D:// ” และรันโปรแกรมจาวาด้านบนเพื่อให้มันทำงาน

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