ข้อผิดพลาด ' ไม่พบหรือโหลดคลาสหลัก ' เกิดขึ้นเมื่อใช้คำสั่ง java ในพรอมต์คำสั่งเพื่อเปิดโปรแกรม Java โดยระบุชื่อคลาสในเทอร์มินัล สาเหตุส่วนใหญ่เกิดจากความผิดพลาดในการเขียนโปรแกรมของผู้ใช้ขณะประกาศคลาส
ดังที่ได้กล่าวไว้ก่อนหน้านี้ข้อผิดพลาดนี้ส่วนใหญ่ไม่เกี่ยวข้องกับระบบและผู้ใช้ทำผิดพลาดในหลายสถานการณ์ดังที่แสดงด้านล่าง ก่อนที่จะก้าวต่อไปเราถือว่าคุณมีความรู้พื้นฐานเกี่ยวกับภาษาโปรแกรม Java และวิธีการทำงาน
อะไรเป็นสาเหตุของข้อผิดพลาด 'ไม่พบหรือโหลดคลาสหลัก' ใน Java
ข้อความ 'ไม่พบหรือโหลดคลาสหลัก' หมายความว่าขั้นตอนแรกของเอ็นจิน Java ที่ดึงคลาสสำหรับการดำเนินการล้มเหลว คำสั่ง Javaไม่สามารถที่จะหาระดับที่ไดเรกทอรีที่ถูกต้อง
ในบางกรณีคุณต้องเพิ่มเส้นทางไฟล์ที่ถูกต้องและชี้เทอร์มินัล Java ไปยังตำแหน่งที่ถูกต้อง เนื่องจากคุณกำลังดำเนินการคำสั่งจากเทอร์มินัลบรรทัดคำสั่งคอมพิวเตอร์จึงไม่ทราบว่าจะพบคลาสหรืออยู่ที่ใด ใน IDE เป้าหมายนี่ไม่ใช่ปัญหาเนื่องจาก IDE จะคอยชี้ไปที่ไดเร็กทอรีการทำงานปัจจุบัน
ไวยากรณ์ 'java' คืออะไร?
ก่อนที่เราจะเริ่มแก้ไขปัญหาสาเหตุที่เทอร์มินัลส่งคืนข้อผิดพลาดให้เราเมื่อพยายามดำเนินการก่อนอื่นเราต้องดูไวยากรณ์ของคำสั่ง หากคุณไม่ได้ใช้ไวยากรณ์ที่ถูกต้องคุณจะต้องเผชิญกับข้อผิดพลาดนี้อย่างหลีกเลี่ยงไม่ได้
ไวยากรณ์ปกติของคำสั่งเป็นดังนี้:
java [... ] [... ]
นี่คืออ็อพชันบรรทัดคำสั่งเป็นชื่อคลาส Java แบบเต็มและเป็นอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งผ่านไปยังแอ็พพลิเคชันของคุณเมื่อคอมไพล์แพ็กเกจทั้งหมด
ตัวอย่างของคำสั่งที่ถูกต้องคือ:
java -Xmx100m com.acme.example.ListAppuals kevin arrows bart
คำสั่งดังกล่าวจะทำให้คำสั่ง java ดำเนินการดังต่อไปนี้:
- จะค้นหาเวอร์ชันคอมไพล์ของคลาส ' com.acme.example.ListAppuals '
- หลังจากค้นหาก็จะโหลดคลาส
- จากนั้นเมื่อโหลดคลาสแล้วคลาสจะถูกค้นหาเมธอด 'main' ที่มีลายเซ็นตัวปรับแต่งและประเภทการส่งคืนที่ถูกต้อง ตัวอย่างคลาสหลักจะเป็นดังนี้:
โมฆะคงที่สาธารณะ main (String [])
- เมธอดนี้จะถูกเรียกด้วยอาร์กิวเมนต์ 'kevin', 'arrows' และ 'bart' เป็นสตริง []
วิธีแก้ไข 'ไม่พบหรือโหลดคลาสหลัก'
โซลูชันที่ 1: การตรวจสอบอาร์กิวเมนต์ชื่อคลาส
ข้อผิดพลาดที่พบบ่อยที่สุดที่ผู้ใช้ทำคือระบุชื่อคลาสผิดเป็นอาร์กิวเมนต์ (หรือชื่อคลาสที่ถูกต้องเป็นรูปแบบที่ไม่ถูกต้อง) เนื่องจากเรากำลังประกาศพารามิเตอร์ในบรรทัดคำสั่งจึงมีโอกาสสูงที่คุณจะส่งอาร์กิวเมนต์ชื่อคลาสในรูปแบบที่ไม่ถูกต้อง เราจะแสดงรายการสถานการณ์ที่เป็นไปได้ทั้งหมดที่คุณสามารถทำผิดพลาดได้
- เขียนชื่อชั้นที่เรียบง่าย หากคุณประกาศคลาสในแพ็กเกจเช่น 'com.acme.example' คุณต้องใช้ชื่อคลาสเต็มรวมทั้งแพ็กเกจในคำสั่ง Java
java com.acme.example.ListAppuals
แทน
รายการ javaAppuals
- คุณควรประกาศชื่อคลาสแทนการประกาศชื่อไฟล์หรือชื่อพา ธ 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:> ตั้งค่า CLASSPATH = classpath1; classpath2 ...
หากต้องการข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับ classpath คุณควรตรวจสอบเอกสารต่อไปนี้
เอกสารคำสั่ง Java
การตั้งค่า classpath
โซลูชันที่ 3: การตรวจสอบไดเร็กทอรี
เมื่อคุณประกาศไดเร็กทอรีเป็น classpath มันจะสอดคล้องกับรูทของเนมสเปซเสมอ ตัวอย่างเช่นถ้า“ / usr / local / acme / class” อยู่บน classpath ดังนั้น Java จะค้นหาคลาส“ com.acme.example.Appuals” จะมองหาคลาสที่มีชื่อพา ธ ต่อไปนี้:
/usr/local/acme/classes/com/acme/example/Appuals.class
ดังนั้นโดยพื้นฐานแล้วหากคุณใส่ที่อยู่ต่อไปนี้ใน classpath Java จะไม่สามารถค้นหาคลาสได้:
/ usr / local / acme / class / 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 / สุดยอด / เรียน / co.th / สุดยอด / ตัวอย่าง /
จากนั้นสถานการณ์ต่อไปนี้จะเกิดขึ้น:
# 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
Note: The classpath needs to also include all the other classes (non-system) which your applications needs.
Solution 4: Checking class package
หากวิธีแก้ไขปัญหาข้างต้นทั้งหมดเป็นจริงในกรณีของคุณคุณต้องตรวจสอบให้แน่ใจว่าซอร์สโค้ดของคุณอยู่ในโฟลเดอร์ที่ถูกต้อง นอกจากนี้คุณยังได้ประกาศอย่างถูกต้องแพคเกจ หากคุณเรียกใช้รหัสของคุณด้วย IDE รหัสอาจแจ้งให้คุณทราบเกี่ยวกับปัญหานี้ อย่างไรก็ตามในกรณีของเราเนื่องจากเราเรียกใช้ใน command prompt ความผิดพลาดจะไม่มีใครสังเกตเห็นและคุณจะได้รับข้อผิดพลาดของชั้นเรียนภายใต้การสนทนา