ไม่พบหรือโหลดข้อผิดพลาดของคลาสหลัก

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. บทสรุป

ในบทช่วยสอนนี้เราได้เรียนรู้สาเหตุที่เป็นไปได้ของข้อผิดพลาด“ ไม่พบหรือโหลดคลาสหลัก”

จากนั้นเราได้เรียนรู้วิธีแก้ไขข้อผิดพลาดนี้ด้วย