Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การแก้ไขปัญหา >> ข้อผิดพลาด Windows

แก้ไข: "Could not find or load main class" ใน Java

ข้อผิดพลาด 'Could not find or load main class' เกิดเมื่อใช้คำสั่ง java ใน Command Prompt เพื่อรันโปรแกรม Java โดยระบุชื่อคลาส สาเหตุหลักคือข้อผิดพลาดในการประกาศคลาสของโปรแกรมเมอร์

แก้ไข:  Could not find or load main class  ใน Java

ข้อผิดพลาดนี้ส่วนใหญ่ไม่ใช่ปัญหาระบบ แต่มาจากข้อผิดพลาดของผู้ใช้ในหลายสถานการณ์ สมมติว่าคุณมีความรู้พื้นฐาน Java

สาเหตุของข้อผิดพลาด 'Could not find or load main class'

ข้อความหมายถึง ขั้นตอนแรกของ Java engine ในการดึงคลาสเพื่อรัน ล้มเหลว คำสั่ง java ไม่สามารถ locate คลาสในไดเรกทอรีที่ถูกต้องได้

บางกรณีต้องเพิ่ม file path ที่ถูกต้อง เพื่อชี้ให้ Java terminal รู้ตำแหน่งคลาส เนื่องจากรันจากบรรทัดคำสั่ง คอมพิวเตอร์ไม่รู้ว่าคลาสอยู่ที่ไหน ใน IDE จะไม่มีปัญหานี้เพราะ IDE เก็บ pointer ไว้ที่ working directory ปัจจุบัน

Syntax ของ 'java <class-name>' คืออะไร?

ก่อนแก้ไข ต้องเข้าใจ syntax ที่ถูกต้อง หากผิด จะเจอข้อผิดพลาดนี้แน่นอน

Syntax ปกติ:

 java [ <option> ... ] <class-name> [<argument> ...]

<option> = ตัวเลือกบรรทัดคำสั่ง, <class-name> = ชื่อคลาส Java ที่สมบูรณ์ (fully qualified), <argument> = อาร์กิวเมนต์ส่งให้แอปเมื่อคอมไพล์

ตัวอย่างคำสั่งที่ถูกต้อง:

java -Xmx100m com.acme.example.ListAppuals kevin arrows bart

คำสั่งนี้จะ:

  • ค้นหาเวอร์ชันคอมไพล์ของคลาส com.acme.example.ListAppuals
  • โหลดคลาส
  • ค้นหาเมธอด main ที่มี signature, modifiers, return type ถูกต้อง ตัวอย่าง:
    public static void main(String[])
  • เรียกเมธอดพร้อมอาร์กิวเมนต์ 'kevin', 'arrows', 'bart' เป็น string[]

วิธีแก้ 'Could not find or load main class'

วิธีที่ 1: ตรวจสอบ class name argument

ข้อผิดพลาดพบบ่อยที่สุดคือ ใส่ class name ผิด (หรือถูกต้องแต่รูปแบบผิด) เนื่องจากประกาศพารามิเตอร์บนบรรทัดคำสั่ง จึงง่ายที่จะผิด ดูสถานการณ์ที่ผิดได้:

  • ใส่ simple class name แทน fully qualified name หากคลาสอยู่ใน package เช่น com.acme.example ต้องใช้ full classname รวม package:
    java com.acme.example.ListAppuals
    แทนที่จะเป็น
    java ListAppuals
  • ต้องประกาศ classname ไม่ใช่ filename/pathname Java ไม่ดึงคลาสได้หากประกาศ path/filename ตัวผิด:
    java ListAppuals.class java com/acme/example/ListAppuals.class
  • Case-sensitive ตัวพิมพ์ใหญ่-เล็กสำคัญ ผิดแค่ตัวอักษรเดียวโหลดไม่ได้ ตัวผิด:
    java com.acme.example.listappuals
  • ห้ามประกาศ source filename ต้องประกาศแค่ class name ในรูปแบบ full classname ตัวผิด:
    java ListAppuals.java
  • พิมพ์ผิด (typo) หรือลืมไม่ได้พิมพ์ class name เลย

หากเจอข้อผิดพลาดเหล่านี้ ให้แก้ไข แล้วลองรันใหม่

วิธีที่ 2: ตรวจสอบ classpath

หาก class name ถูกต้องแต้ยังเจอข้อผิดพลาด อาจเป็นเพราะ java command หาคลาสที่ path ไม่เจอ Classpath คือ path ที่ Java runtime ค้นหา resource และ class files ตั้งค่าได้ 2 วิธี:

C:> sdkTool -classpath classpath1;classpath2... C:> set CLASSPATH=classpath1;classpath2...

ศึกษาเพิ่มเติมได้จากเอกสาร Java command documentation และ Setting classpath

วิธีที่ 3: ตรวจสอบ directory

เมื่อประกาศ directory เป็น classpath จะตรงกับ root ของ namespace ตัวอย่าง: หาก /usr/local/acme/classes อยู่ใน classpath Java จะหาคลาส com.acme.example.Appuals ที่ path:

/usr/local/acme/classes/com/acme/example/Appuals.class

ดังนั้น หากใส่ path นี้ใน classpath Java จะหาไม่เจอ:

/usr/local/acme/classes/com/acme/example

ต้องเช็ค subdirectory ว่าตรงกับ FQN ไหม หาก FQN คือ com.acme.example.Appuals Java จะหา Appuals.class ในโฟลเดอร์ com/acme/example

ตัวอย่างสถานการณ์:

  • คลาสที่จะรัน: com.acme.example.Appuals
  • Full file path: /usr/local/acme/classes/com/acme/example/Appuals.class
  • Current working directory: /usr/local/acme/classes/com/acme/example/

สถานการณ์ต่างๆ:

# ผิด ต้องใช้ FQN java Appuals # ผิด ไม่มีโฟลเดอร์ com/acme/example ใน cwd java com.acme.example.Appuals # ผิด เหมือนข้างต้น java -classpath . com.acme.example.Appuals # ถูก relative classpath java -classpath ../../.. com.acme.example.Appuals # ถูก absolute classpath java -classpath /usr/local/acme/classes com.acme.example.Appuals

หมายเหตุ: Classpath ต้องรวมคลาสอื่นๆ (non-system) ที่แอปต้องการด้วย

วิธีที่ 4: ตรวจสอบ class package

หากข้างต้นถูกต้องทั้งหมด ตรวจสอบว่า source code อยู่ในโฟลเดอร์ที่ถูกต้อง และประกาศ package ถูกต้อง หากรันใน IDE จะแจ้งเตือน แต่ใน Command Prompt จะไม่รู้ และเจอ class error นี้