2015-02-06 98 views
1

我已經在這裏看到類似這樣的問題,但我找不到特定於我的情況的問題,所以很遺憾,如果這是一個破舊的問題。NoClassDefFoundError Java(錯誤的名稱)

我有一個類P,它是位於〜/ JavaClasses/myname/utils中的包myname.utils的一部分。我有另一個類沒有聲明爲任何包的一部分,但位於〜/ JavaClasses/myname/practice中。類打印導入類P.這兩個類都可以在〜/ JavaClasses目錄中很好地編譯。然而,當我試圖運行這樣

~/JavaClasses$ java myname/practice/Printing 

我收到以下錯誤編譯的類印刷:

Exception in thread "main" java.lang.NoClassDefFoundError: myname/practice/Printing (wrong name: Printing) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    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:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 
+0

它應該是'java myname.practice.Printing',假設它在名爲'myname.practice'的包中。 – BackSlash 2015-02-06 16:58:38

+0

獲取P類的副本,將其放入包中,並在開始時添加一個'package'語句,以將其標記爲屬於您的包。然後,一切都應該正常工作。 – 2015-02-06 16:59:14

+0

你有任何這樣的源代碼? – dcsohl 2015-02-06 17:13:32

回答

0

這是因爲你不使用包名。是的,當java給出的錯誤和未找到類的包名時,它使用/。但是這些應該用.代替。因爲包名稱的一部分總是以句點分隔,而且從不以斜線分隔。所以如果我有一個包foo.bee。然後,當我試圖運行

java foo.bee

它將目前運行的所有,但是如果我試圖

java foo/bee

它會抱怨一類不DEF錯誤。

1

錯誤相關myname.utils.P類,但它是因爲印刷類沒有包定義。這意味着該類的真實全名是打印,但是如果從〜/ JavaClasses文件夾啓動java命令,則說明Printing類的全名是myname.practice.Printing

您有2個選項來解決這個問題:

1)聲明myname.practice包裝印刷類中(我的建議是一個)

2)添加myname.practice文件夾到類路徑中,以這樣的方式

~/JavaClasses$ java -cp myname.practice:. Printing 

.代表當前目錄,所以你仍然可以參考,有必要從〜/ JavaClasses文件夾中的myname.utils.P類。

附註。在編譯時你沒有錯誤,因爲當你啓動javac和當前使用的文件夾時,你可能沒有指定類路徑。通過這種方式,myname.utils.P即使通過Printing也可以在每個班級都沒有問題的情況下被引用。

相關問題