Home : วิธีแก้ไขปัญหา Exception in thread "main" java.lang.NoClassDefFoundError
Q10030 - ERRMSG: วิธีแก้ไขปัญหา Exception in thread "main" java.lang.NoClassDefFoundError

Problem

บางครั้งเวลาเรารันโปรแกรมจาวาที่เขียนขึ้น แล้วได้ error java.lang.NoClassDefFoundError อย่างเช่น ถ้าเราเขียนโปรแกรม HelloWorld โดยเก็บไฟล์ HelloWorld.java ไว้ที่ d:\java\test แล้ว compile ด้วยคำสั่ง javac d:\java\test\HelloWorld.java (โดย directory ปัจจุบันเป็น d:\java) เมื่อรันคำสั่ง java HelloWorld แล้วได้ error ตามที่แสดงข้างล่างนี้

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld

Cause

ที่เกิด error ขึ้นแบบนี้ ก็เพราะว่า Java interpreter (Java VM) หา class file ของโปรแกรม HelloWorld ไม่เจอ โดยปรกติแล้ว Java VM จะหา user class file โดยดูจาก classpath ที่เราได้ระบุไว้ ซึ่งถ้าเราไม่ได้ระบุ ค่า default ของ classpath จะเป็น current directory หรือ directory ปัจจุบัน ในกรณีของตัวอย่างนี้ ปัญหาเกิดขึ้นจากการที่เรา compile HelloWorld.java ใน d:\java\test ทำให้ class file (HelloWorld.class) ถูกสร้างขึ้นใน directory d:\java\test  เนื่องจากค่า default ของ classpath คือ directory ปัจจุบัน (d:\java) ทำให้เมื่อเราพยายามจะรันโปรแกรมจาก directory d:\java  Java VM ก็จะพยายามหา class file ของ HelloWorld (HelloWorld.class) ใน d:\java ทำให้หาไม่เจอ

Solution

วิธีแก้ไขก็ไม่ยากอะไร ถ้าเราไม่ต้องการ set ค่า classpath เราก็ควรเปลี่ยน directory ปัจจุบันให้เป็น directory ที่มี class file นั้นอยู่เสียก่อน อย่างในกรณีนี้ เราก็ควรเปลี่ยนไป directory d:\java\test ก่อนที่รันค่ำสั่ง java HelloWorld แต่ถ้าเราต้องการระบุค่าของ classpath ก็สามารถทำได้สองวิธีคือ

1. set ค่าของ CLASSPATH environment variable

โดย set ให้รวมถึง path ที่ class file อยู่ อย่างเช่น

พิมพ์คำสั่ง set CLASSPATH=d:\java\test;. ที่ command prompt

Note: การ set classpath แบบนี้จะใช้ได้แค่ใน console นี้เท่านั้น ถ้าการ set แบบถาวรต้อง set เป็น system variable โดยเข้าไปที่ My Computer > Properties > Advanced > Environment Variables > System Variables แล้วเพิ่มตัวแปร CLASSPATH เข้าไป

2. ระบุค่า classpath โดยใช้ option -classpath หรือ -cp ของ Java interpreter (วิธีนี้จะดีกว่าแบบที่ (1) เพราะว่าการรันโปรแกรมจาวาแต่ล่ะครั้งจะใช้ classpath ที่ระบุ ทำให้เมื่อเรารันโปรแกรมจาวามากกว่า 1 ตัว ก็จะใช้ classpath แยกกัน ช่วยให้ไม่สับสนเวลาหา class จึงแนะนำให้ใช้แบบนี้)

java -cp d:\java\test;. HelloWorld หรือ

java -classpath d:\java\test;. HelloWorld

สองวิธีนี้จะช่วยให้เราสามารถรันโปรแกรม HelloWorld จาก directory ไหนก็ได้ โดยไม่จำเป็นจะต้องอยู่ใน directory ที่ class file ของโปรแกรมนั้นอยู่

Related Articles
Q10011 - INFO: เมื่อไหร่เราถึงจำเป็นต้อง set classpath ?
Q10035 - HOWTO: วิธี set class path บน Windows
Q10040 - ERRMSG: Exception in thread "main" java.lang.NoClassDefFoundError กรณีเรียกใช้คลาสใน package
Q10048 - HOWTO: วิธีการ set classpath กรณีที่ต้องการใช้งาน jar file

Article Attachments
No Attachments Available.

Related External Links
No Related Links Available.
Help us improve this article...
What did you think of this article?

poor 
1
2
3
4
5
6
7
8
9
10

 excellent
Tell us why you rated the content this way. (optional)
 
Approved Comments...
ขอบคุณมากครับ Approved: 9/4/2009 2:49 PM
so cool !!! Approved: 5/21/2009 1:41 PM
มีประโยชน์มากเลยครับ ขอบคุณครับ ^_^ Approved: 4/24/2009 12:17 AM
Created on 4/30/2007 4:16 PM.
Last Modified on 5/11/2007 10:41 PM.
Last Modified by admin.
Skill Level: Beginner.
Article has been viewed 8398 times.
Rated 5 out of 10 based on 7 votes.
Print Article
Email Article