เมื่อใดก็ตามที่เราพยายามโหลดคลาส หากตัวโหลดคลาสไม่พบคลาสที่เส้นทางที่ระบุ 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.........