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

ทำไมถึงได้ ClassNotFoundException แม้คลาสจะมีอยู่จริงใน Java?

ClassNotFoundException เกิดขึ้นเมื่อ Class Loader ไม่พบคลาสที่ระบุที่ Path ที่กำหนด แม้ไฟล์ .class จะมีอยู่จริงก็ตาม สาเหตุหลักคือ "Path ไม่ตรง" หรือ "Classpath ไม่ถูกต้อง"

สถานการณ์ที่พบบ่อย

  1. ชื่อ Package/Class ผิด - สะกดผิด, ใหญ่-เล็กตัวอักษรไม่ตรง
  2. Classpath ไม่รวมโฟลเดอร์ที่มี .class - รันจากโฟลเดอร์อื่นโดยไม่ตั้ง -cp หรือ CLASSPATH
  3. โครงสร้างโฟลเดอร์ไม่ตรงกับ Package Declaration - ไฟล์ .class ไม่อยู่ในโฟลเดอร์ที่ตรงกับ package

ตัวอย่าง: ชื่อ Package ผิด

// ไฟล์ Sample.java
package myPackage.example;
public class Sample {
    static {
        System.out.println("The class named Sample loaded successfully......");
    }
}

คอมไพล์: javac -d . Sample.java -> สร้างโฟลเดอร์ myPackage/example/Sample.class

public class ClassNotFoundExample {
    public static void main(String args[]) {
        try {
            // สะกดผิด: exampl (ขาด e)
            Class.forName("myPackage.exampl.Sample");
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

ผลลัพธ์

java.lang.ClassNotFoundException: myPackage.exampl.Sample
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(...)

ตัวอย่าง: Classpath ไม่ถูกต้อง

ไฟล์ .class อยู่ที่ D:/myPackage/example/Sample.class แต่รันโปรแกรมจาก E:/ โดยไม่ตั้ง Classpath

E:\> java ClassNotFoundExample
// Error: ClassNotFoundException: myPackage.example.Sample

วิธีแก้ไข

E:\> java -cp D:/ ClassNotFoundExample
// หรือ
E:\> java -classpath D:/ ClassNotFoundExample
// Output: The class named Sample loaded successfully......

สรุป

  • ตรวจสอบ Spelling & Case Sensitivity ของชื่อคลาสและแพ็กเกจ
  • ใช้ -cp หรือ -classpath ระบุ Root Directory ที่มี Package Structure
  • หรือวางไฟล์ .class / JAR ไว้ในโฟลเดอร์ที่รันโปรแกรม (Current Directory)