我最近開始學習Java,但是我遇到了一些與NoClassDefFoundError
有關的問題。我試圖從這個網站和其他地方研究解決方案,但仍然無法解決它們。我使用CLASSPATH環境變量集從Windows 7命令提示符運行我的程序,而不是爲每個程序運行定義它。它設置爲C:
。爲了排除故障,我創建了一個簡化目錄結構的測試包。帶繼承類的Java NoClassDefFoundError
在C:\test
,我有Shape.java
和Circle.java
。 Shape.java
看起來是這樣的:
package test;
class Shape {
void draw() { System.out.println("Drawing a new shape"); }
}
和Circle.java
看起來是這樣的:
package test;
public class Circle extends Shape {
public static void main(String[] args) {
Circle round = new Circle();
round.draw();
}
}
如果我在與操作命令提示符像
C:\>javac test\Shape.java
C:\>javac test\Circle.java
和編譯都Shape.java
和Circle.java
從C:\
運行編譯的Circle.class
文件,如
C:\java test\Circle
我得到的輸出我想到:
Drawing a new shape
但是,如果我編譯從C:\test
像
C:\test>javac Shape.java
C:\test>javac Circle.java
內Shape.java
和Circle.java
,然後嘗試從任何地方像運行Circle.class
C:\test>java Circle
或類似這樣的
C:\> java test\Circle
我收到以下錯誤消息。
Exception in thread "main" java.lang.NoClassDefFoundError: Circle (wrong name: t
est/Circle)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
有人能解釋爲什麼它是在JAVA文件從C:\test
文件夾中編譯,但編譯後的文件圈產生錯誤?我的CLASSPATH有問題嗎?感謝您的閱讀和希望即將到來的解決方案!
編輯:我做更多的測試,事實證明,如果我編譯從C:\test
目錄Shape.java
和Circle.java
文件,但是從C:\
目錄中運行它,它的工作原理。這會改變什麼嗎?
編輯2:經過更多的測試後,事實證明,我可以事實上編譯並運行C:\ test目錄下的Shape.java和Circle.java文件,只要我使用命令java test.Circle 。我誤解了JVM尋找類的方式。我現在明白它在分析包導入語句時使用與編譯器相同的方法。
使用eclipse工作臺。 – Makky
使用'java test.Circle' –
您應該認真使用像Eclipse這樣的IDE。 –