เมื่อทำงานกับ Java การรันโค้ดขั้นสุดท้ายเกิดผ่าน pre-compiled classes หลังเขียนคลาสใน Java คอมไพเลอร์แปลง source code ระดับสูงเป็น bytecode ระดับต่ำ สำหรับแต่ละคลาสที่เขียน จะได้ bytecode pre-compiled instance หนึ่งตัว bytecode นี้มีโค้ดระดับต่ำที่รันบน Java Virtual Machine ได้
แต่บางครั้งการรันคำสั่ง java ในเทอร์มินัล อาจคืนค่า: could not find or load main class แสดงว่ามีปัญหากับ bytecode ของคลาส เราจะแก้ยังไง? มาดูกัน
'could not find or load main class' หมายถึงอะไร?
Error could not find or load main class บ่งบอกว่ามีปัญหากับการออกแบบโค้ด ปกติเกิดตอนรันคำสั่งแบบนี้ในเทอร์มินัล:
java Test
"Test" คือชื่อคลาสที่มีโค้ดต้องการรัน หากเจอ error could not find or load main class หมายถึง bytecode ของคลาส Test หาไม่เจอ
วิธีแก้ 'could not find or load main class' Error
มีหลายวิธีแก้ error นี่คือวิธีชั้นนำในการระบุและแก้ไข:
1. ตรวจสอบ Typo (ข้อผิดพลาดการพิมพ์)
สาเหตุแรกอาจเป็นการพิมพ์ผิด ไวยากรณ์การเรียกโปรแกรมมีแค่ 2 keywords — "java" และชื่อคลาส — จุดที่อาจพลาดคือชื่อคลาส หากพิมพ์ keyword ผิด จะได้ error "command not found" บนคอมมานด์ไลน์ชัดเจน
ลองตรวจสอบชื่อคลาสให้ดีว่าพิมพ์ถูกต้อง บ่อยครั้ง error มาจาก spelling และ typing mistakes เหล่านี้
สมมติเขียนคลาส "Test" ในไฟล์ "Test.java" คอมไพล์ผ่านคอมมานด์ไลน์:
javac Test.java
แล้วรันด้วยคำสั่ง:
java Test
ควรทำงานได้ปกติ แต่ถ้าพิมพ์ "Test" ผิดในคำสั่งข้างต้น อาจเจอ Could not find or load main class error
2. Classpath ใน Application ผิด
Classpath (CLASSPATH) เป็น environment variable ชี้ไปที่เก็บ user classes ในระบบ ไดเรกทอรี่ที่ classpath ชี้ไป มี pre-written classes หลายตัว ที่ import เข้าโค้ดได้โดยตรง
สมมติเขียน import command:
Import org.company.Foo;
รันจะทำให้ JVM หา "Foo" class ที่ <classpath>/org/company/Foo.java หาก classpath ชี้ที่ผิด JVM จะหาคลาสที่ต้องการไม่เจอ และโยน could not find or load main class error
บางครั้ง classpath อาจไม่มี system classes ทั้งหมดที่โปรแกรมพึ่งพา หมายถึงอาจพยายาม include คลาสจากแพ็กเกจที่ยังไม่ดาวน์โหลดหรือ setup ไว้ กรณีนี้ก็จะเจอ error นี้
3. คลาสถูกประกาศใน Package ผิด
ถ้า package ที่เขียนบนสุดของ source code file ไม่ชี้ไปที่ package/module ที่คลาสถูกประกาศอยู่ IDE ส่วนใหญ่ช่วยตรวจได้ง่าย โดยแสดง error ใน linting process แต่ถ้าหลุดตาจะก่อให้เกิด error ข้างต้น
วิธีแก้ที่ดีที่สุด: ตรวจสอบว่าชื่อ package ของคลาสชี้ไปที่ package ถูกต้อง หากใช้ IDE ขั้นสูง như IntelliJ หรือ VSCode ให้เปิด linting สำหรับปัญหานี้
ตัวอย่าง: คลาสเก็บที่ project/src/com/foo/bar:
package com.foo.baz;
class Bar {
// Some code here
}
เห็นไหม package ชี้ com/foo/baz แต่คลาสเก็บอยู่จริงที่ com/foo/bar ต้องแก้ package statement ให้ชี้ package ที่ถูกต้อง:
package com.foo.bar;
class Bar {
// Some code here
}
สรุป
บทความนี้ดูว่า Could not find or load main class ใน Java คืออะไร ทำไมจึงเกิดขึ้น แล้วสรุปด้วยการระบุวิธีแก้ error นี้ชั้นนำ
หากเขียนโปรแกรมใน Java error นี้อาจขึ้นบ้าง
แม้ error message จะดูน่ากลัว แต่แก้ไขไม่ยากเลย ต้องเช็คว่า คลาสที่หาอยู่ใน location ที่ถูกต้องหรือไม่