1. บทนำ
บางครั้งเมื่อเรารันโปรแกรม Java เราอาจเห็น“ ไม่พบหรือโหลดคลาสหลัก” เดาสาเหตุได้ง่าย: JVM ไม่พบคลาสหลักและให้ข้อผิดพลาดนี้ แต่ทำไมถึงทำไม่ได้?
ในบทช่วยสอนนี้เราจะพูดถึงสาเหตุที่เป็นไปได้ของการไม่พบคลาสหลัก นอกจากนี้เราจะดูวิธีแก้ไข
2. โปรแกรมตัวอย่าง
เราจะเริ่มต้นด้วยโปรแกรมHelloWorld :
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }
ตอนนี้ขอรวบรวม:
$ javac HelloWorld.java
ที่นี่คอมไพเลอร์จะสร้างไฟล์. classสำหรับโปรแกรมของเรา ไฟล์. classนี้จะถูกสร้างขึ้นในไดเร็กทอรีเดียวกัน .classไฟล์จะมีชื่อเดียวกับชื่อชั้นที่กำหนดในโปรแกรม Java นี้.classไฟล์ปฏิบัติการ
ในส่วนต่อไปนี้เราจะเรียกใช้ไฟล์. classนี้และพยายามทำความเข้าใจสาเหตุที่เป็นไปได้ของข้อผิดพลาด“ ไม่พบหรือโหลดคลาสหลัก”
3. ชื่อชั้นเรียนไม่ถูกต้อง
ในการรันไฟล์. class ที่สร้างโดยคอมไพเลอร์ Java เราสามารถใช้คำสั่งด้านล่าง:
java
ตอนนี้ให้เรียกใช้โปรแกรมของเรา:
$ java helloworld Error: Could not find or load main class helloworld
ใช่มันล้มเหลวด้วยข้อผิดพลาด "ไม่พบหรือโหลดคลาสหลักของ helloworld"
ตามที่กล่าวไว้ก่อนหน้านี้คอมไพเลอร์จะสร้าง.classไฟล์ที่มีชื่อเดียวกันที่แน่นอนให้กับชั้น Java ในโปรแกรม ดังนั้นในกรณีของเราระดับหลักจะมีชื่อHelloWorldไม่HelloWorld
ลองอีกครั้งโดยใช้ปลอกที่ถูกต้อง:
$ java HelloWorld Hello world..!!!
คราวนี้วิ่งได้สำเร็จ
3.1. นามสกุลไฟล์
ในการคอมไพล์โปรแกรม Java เราต้องระบุชื่อไฟล์ที่มีนามสกุล (. java ):
$ javac HelloWorld.java
แต่การเรียกใช้ไฟล์. ไฟล์คลาสเราต้องระบุชื่อคลาสไม่ใช่ชื่อไฟล์ ดังนั้นจึงไม่จำเป็นต้องระบุนามสกุล. class :
$ java HelloWorld.class Error: Could not find or load main class HelloWorld.class
ดังนั้นขอเรียกใช้โปรแกรมของเราอีกครั้งโดยใช้ชื่อคลาสที่ถูกต้อง:
$ java HelloWorld Hello world..!!!
4. ชื่อแพ็คเกจ Java
ใน Java เราให้เรียนที่คล้ายกันร่วมกันในสิ่งที่เราเรียกแพคเกจ
มาย้ายคลาสHelloWorldไปไว้ในแพ็คเกจcom.baeldung :
package com.baeldung; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }
ตอนนี้เรามารวบรวมและเรียกใช้โปรแกรมHelloWorld ที่อัปเดตก่อน
$ java HelloWorld Error: Could not find or load main class HelloWorld
แต่เราได้รับข้อผิดพลาดอีกครั้ง“ ไม่พบหรือโหลดคลาสหลัก HelloWorld”!
มาลองทำความเข้าใจว่าเราพลาดอะไรที่นี่
ในการรันคลาส Java ที่อยู่ในแพ็กเกจเราต้องระบุชื่อแบบเต็ม ดังนั้นในกรณีของเราHelloWorld ของชื่อที่มีคุณสมบัติครบถ้วนเป็นcom.baeldung.HelloWorld
ตอนนี้เมื่อเราสร้างแพ็คเกจcom.baeldungเราได้สร้างโครงสร้างโฟลเดอร์เช่น:
com/baeldung/HelloWorld.java
ขั้นแรกให้ลองเรียกใช้โปรแกรมของเราจากไดเรกทอรีcom / baeldung :
$ java com.baeldung.HelloWorld Error: Could not find or load main class com.baeldung.HelloWorld
ถึงกระนั้นเรายังไม่สามารถเรียกใช้โปรแกรมของเราได้
ที่นี่เมื่อเราระบุชื่อคลาสcom.baeldung.HelloWorld ที่มีคุณสมบัติครบถ้วนJava พยายามค้นหาไฟล์ HelloWorld.class ในcom / baeldungภายใต้ไดเร็กทอรีที่เรารันโปรแกรม
เนื่องจากเราอยู่ในcom / baeldungแล้ว Java จึงไม่สามารถค้นหาและเรียกใช้โปรแกรมHelloWorldได้
ตอนนี้ขอย้ายกลับไปที่โฟลเดอร์หลักและเรียกใช้:
$ java com.baeldung.HelloWorld Hello world..!!!
ใช่เราสามารถกล่าว“ สวัสดี” กับโลกได้อีกครั้ง
5. Classpath ไม่ถูกต้อง
ก่อนที่จะดำเนินการต่อเรามาทำความเข้าใจก่อนว่า classpath คืออะไรซึ่งเป็นชุดของคลาสที่มีให้สำหรับ JVM ที่กำลังทำงานอยู่
เราใช้ตัวแปร classpath เพื่อบอก JVM ว่าจะหาไฟล์. classบนระบบไฟล์ได้ที่ไหน
ในขณะที่ใช้โปรแกรมที่เราสามารถให้ classpath โดยใช้-classpathตัวเลือก ตัวอย่าง:
java -classpath /my_programs/compiled_classes HelloWorld
ที่นี่ Java จะค้นหาไฟล์HelloWorld.classในโฟลเดอร์/ my_programs / comple_classesซึ่งเป็นโฟลเดอร์ที่มีชื่อที่เราเพิ่งสร้างขึ้น โดยค่าเริ่มต้นตัวแปร classpath จะถูกตั้งค่าเป็น“.” ซึ่งหมายถึงไดเร็กทอรีปัจจุบัน
ในส่วนด้านบนเราเปลี่ยนไดเร็กทอรีของเราเพื่อเรียกใช้โปรแกรมของเรา แต่ถ้าเราต้องการเรียกใช้จากโฟลเดอร์อื่นล่ะ? นั่นคือตอนที่ตัวแปร classpath ช่วยเรา
ในการเรียกใช้โปรแกรมของเราจากไดเร็กทอรีคือcom / baeldungเราสามารถระบุได้ว่า classpath ของเรามีสองไดเรกทอรีขึ้นมาหนึ่งรายการสำหรับแต่ละส่วนของแพ็คเกจ
$ java -claspath ../../ com.baeldung.HelloWorld Hello world..!!!
ในที่นี้“ .. ” แสดงถึงไดเร็กทอรีหลัก ในกรณีของเรา“ ../../” แสดงถึงลำดับชั้นสูงสุดของแพ็กเกจ
6. บทสรุป
ในบทช่วยสอนนี้เราได้เรียนรู้สาเหตุที่เป็นไปได้ของข้อผิดพลาด“ ไม่พบหรือโหลดคลาสหลัก”
จากนั้นเราได้เรียนรู้วิธีแก้ไขข้อผิดพลาดนี้ด้วย