ClassNotFoundException เกิดขึ้นเมื่อ Class Loader ไม่พบคลาสที่ระบุที่ Path ที่กำหนด แม้ไฟล์ .class จะมีอยู่จริงก็ตาม สาเหตุหลักคือ "Path ไม่ตรง" หรือ "Classpath ไม่ถูกต้อง"
สถานการณ์ที่พบบ่อย
- ชื่อ Package/Class ผิด - สะกดผิด, ใหญ่-เล็กตัวอักษรไม่ตรง
- Classpath ไม่รวมโฟลเดอร์ที่มี .class - รันจากโฟลเดอร์อื่นโดยไม่ตั้ง
-cpหรือCLASSPATH - โครงสร้างโฟลเดอร์ไม่ตรงกับ 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)