ข้อผิดพลาด 'ไม่พบหรือโหลดคลาสหลัก ’ เกิดขึ้นเมื่อใช้คำสั่ง java ในพร้อมท์คำสั่งเพื่อเรียกใช้โปรแกรม Java โดยการระบุชื่อคลาสในเทอร์มินัล สาเหตุส่วนใหญ่เกิดจากความผิดพลาดในการเขียนโปรแกรมของผู้ใช้ในขณะประกาศคลาส
ดังที่กล่าวไว้ก่อนหน้านี้ ข้อผิดพลาดนี้ส่วนใหญ่ไม่เกี่ยวข้องกับระบบ และผู้ใช้ทำผิดพลาดในหลาย ๆ สถานการณ์ดังที่แสดงด้านล่าง ก่อนที่จะก้าวไปข้างหน้า เราคิดว่าคุณมีความรู้พื้นฐานเกี่ยวกับภาษาการเขียนโปรแกรม Java และวิธีการทำงาน
อะไรทำให้เกิดข้อผิดพลาด 'ไม่พบหรือโหลดคลาสหลัก' ใน Java
ข้อความ 'ไม่พบหรือโหลดคลาสหลัก' หมายความว่าขั้นตอนแรกของเอ็นจิน Java ดึงคลาสสำหรับการดำเนินการล้มเหลว คำสั่งจาวา ไม่สามารถค้นหา คลาสที่ไดเร็กทอรีที่ถูกต้อง
ในบางกรณี คุณต้องเพิ่ม เส้นทางไฟล์ที่ถูกต้อง และชี้เทอร์มินัล Java ไปยังตำแหน่งที่ถูกต้อง เนื่องจากคุณกำลังดำเนินการคำสั่งจากเทอร์มินัลบรรทัดคำสั่ง คอมพิวเตอร์ไม่ทราบว่าจะพบคลาสใดหรืออยู่ที่ใด ใน IDE ที่เป็นเป้าหมาย นี่ไม่ใช่ปัญหาเนื่องจาก IDE จะคอยชี้ไปที่ไดเรกทอรีการทำงานปัจจุบัน
ไวยากรณ์ 'java ' คืออะไร
ก่อนที่เราจะเริ่มแก้ไขปัญหาว่าทำไมเทอร์มินัลส่งข้อผิดพลาดกลับมาให้เราเมื่อพยายามดำเนินการ ก่อนอื่นเราต้องดูไวยากรณ์ของคำสั่งก่อน หากคุณไม่ได้ใช้ไวยากรณ์ที่ถูกต้อง คุณจะพบกับข้อผิดพลาดนี้อย่างหลีกเลี่ยงไม่ได้
ไวยากรณ์ปกติของคำสั่งมีลักษณะดังนี้:
java [ <option> ... ] <class-name> [<argument> ...]
ที่นี่
ตัวอย่างของคำสั่งที่ถูกต้องคือ:
java -Xmx100m com.acme.example.ListAppuals kevin arrows bart
คำสั่งดังกล่าวจะทำให้คำสั่ง java ดำเนินการดังต่อไปนี้:
- จะค้นหาเวอร์ชันที่คอมไพล์ของคลาส com.acme.example.ListAppuals ’.
- ค้นหาเสร็จแล้วจะโหลดคลาส
- ถัดไป เมื่อคลาสถูกโหลด คลาสจะถูกค้นหาสำหรับเมธอด 'main' ที่มีลายเซ็นที่ถูกต้อง ตัวปรับแต่ง และประเภทการส่งคืน ตัวอย่างคลาสหลักจะเป็นดังนี้:
public static void main(String[])
- เมธอดนี้จะถูกเรียกด้วยอาร์กิวเมนต์ 'kevin', 'arrows' และ 'bart' เป็นสตริง[]
วิธีแก้ไข 'ไม่พบหรือโหลดคลาสหลักไม่พบ'
โซลูชันที่ 1:การตรวจสอบอาร์กิวเมนต์ชื่อคลาส
ข้อผิดพลาดที่พบบ่อยที่สุดที่ผู้ใช้ทำคือระบุชื่อคลาสผิดเป็นอาร์กิวเมนต์ (หรือชื่อคลาสที่ถูกต้องเป็นรูปแบบที่ไม่ถูกต้อง) เนื่องจากเรากำลังประกาศพารามิเตอร์บนบรรทัดคำสั่ง จึงมีโอกาสสูงที่คุณจะส่งอาร์กิวเมนต์ชื่อคลาสในรูปแบบที่ไม่ถูกต้อง เราจะแสดงรายการสถานการณ์ที่เป็นไปได้ทั้งหมดที่คุณสามารถทำผิดพลาดได้
- การเขียน ชื่อคลาสอย่างง่าย . หากคุณประกาศคลาสในแพ็คเกจ เช่น 'com.acme.example' คุณต้องใช้ ชื่อเต็มของคลาส รวมถึงแพ็คเกจในคำสั่ง Java
java com.acme.example.ListAppuals
แทน
java ListAppuals
- คุณควร ประกาศชื่อคลาส แทนที่จะประกาศชื่อไฟล์หรือชื่อพาธ Java จะไม่ดึงข้อมูลคลาสหากคุณประกาศชื่อพาธ/ชื่อไฟล์สำหรับคลาสนั้น ไม่ถูกต้อง รายการรวมถึงต่อไปนี้:
java ListAppuals.class java com/acme/example/ListAppuals.class
- ปลอก ควรนำมาพิจารณา คำสั่ง Java คำนึงถึงขนาดตัวพิมพ์ และหากคุณทำผิดพลาดแม้แต่ตัวอักษรเดียว คุณจะไม่สามารถโหลดคลาสหลักได้ ตัวอย่าง ข้อผิดพลาดที่ไม่ถูกต้อง คือ:
java com.acme.example.listappuals
- คุณ ไม่ควร ประกาศ ชื่อไฟล์ต้นทาง . ดังที่กล่าวไว้ก่อนหน้านี้ คุณจะต้องประกาศคลาสในรูปแบบชื่อเต็มที่ถูกต้องเท่านั้น ตัวอย่างข้อผิดพลาดคือ:
java ListAppuals.java
- ข้อผิดพลาดนี้จะเกิดขึ้นหากคุณพิมพ์ผิด หรือ ลืมเขียนชื่อชั้นเรียนทั้งหมด .
หากคุณทำผิดพลาดในการประกาศชื่อคลาส อย่าลืมแก้ไขแล้วลองเปิดโปรแกรม
โซลูชัน 2:การตรวจสอบ classpath
หากคุณประกาศชื่อคลาสอย่างถูกต้องแต่ยังคงแสดงข้อผิดพลาด เป็นไปได้ว่าคำสั่ง java จะไม่พบชื่อคลาสที่ระบุที่พาธ classpath เป็นพาธที่รันไทม์ Java ค้นหาไฟล์ทรัพยากรและคลาส คุณสามารถตั้งค่า classpath ได้อย่างง่ายดายโดยใช้คำสั่งที่แตกต่างกันสองคำสั่งดังที่แสดงด้านล่าง:
C:> sdkTool -classpath classpath1;classpath2... C:> set CLASSPATH=classpath1;classpath2...
หากต้องการทราบข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับเส้นทางของชั้นเรียน คุณควรตรวจสอบเอกสารต่อไปนี้
เอกสารคำสั่ง Java
การตั้งค่าคลาสพาธ
โซลูชัน 3:การตรวจสอบไดเรกทอรี
เมื่อคุณประกาศไดเร็กทอรีเป็น classpath ไดเร็กทอรีจะสอดคล้องกับรูทของเนมสเปซเสมอ ตัวอย่างเช่น ถ้า “/usr/local/acme/classes” อยู่บน classpath Java จะค้นหาคลาส “com.acme.example.Appuals” มันจะค้นหาคลาสที่มีชื่อพาธต่อไปนี้:
/usr/local/acme/classes/com/acme/example/Appuals.class
โดยพื้นฐานแล้ว หากคุณใส่ที่อยู่ต่อไปนี้ใน classpath Java จะไม่พบคลาส:
/usr/local/acme/classes/com/acme/example
คุณควรตรวจสอบ ไดเรกทอรีย่อย . ของคุณด้วย และดูว่าตรงกับ FQN หรือไม่ หากคลาส FQN ของคุณคือ “com.acme.example.Appuals” Java จะค้นหา “Appuals.class” ในไดเร็กทอรี “com/acme/example”
เพื่อยกตัวอย่าง สมมติสถานการณ์ต่อไปนี้:
- คลาสที่คุณต้องการเรียกใช้คือ:com.acme.example.Appuals
- เส้นทาง ไฟล์แบบเต็ม คือ:/usr/local/acme/classes/com/acme/example/Appuals.class
- ไดเร็กทอรีการทำงานปัจจุบัน คือ:/usr/local/acme/classes/com/acme/example/
สถานการณ์ต่อไปนี้จะคงอยู่:
# wrong, FQN is needed java Appuals # wrong, there is no `com/acme/example` folder in the current working directory java com.acme.example.Appuals # wrong, similar to above scenario java -classpath . com.acme.example.Appuals # OK ; a relative classpath is set java -classpath ../../.. com.acme.example.Appuals # OK; an absolute classpath is set java -classpath /usr/local/acme/classes com.acme.example.Appuals
หมายเหตุ: classpath ยังต้องรวม class อื่นๆ ทั้งหมด (ไม่ใช่ระบบ) ที่แอปพลิเคชันของคุณต้องการ
โซลูชันที่ 4:การตรวจสอบแพ็คเกจคลาส
หากวิธีแก้ปัญหาทั้งหมดข้างต้นเป็นจริงในกรณีของคุณ คุณต้องแน่ใจว่าซอร์สโค้ดของคุณอยู่ในโฟลเดอร์ที่ถูกต้อง นอกจากนี้ คุณได้ประกาศ แพ็คเกจ . อย่างถูกต้อง . หากคุณเรียกใช้โค้ดด้วย IDE ระบบอาจแจ้งให้คุณทราบเกี่ยวกับปัญหาดังกล่าว อย่างไรก็ตาม ในกรณีของเรา เนื่องจากเรากำลังเรียกใช้ในพรอมต์คำสั่ง ข้อผิดพลาดจะไม่ได้รับการสังเกต และคุณจะได้รับข้อผิดพลาดของชั้นเรียนภายใต้การสนทนา