2011-02-09 100 views
18

嘗試執行我的Java應用程序時出現問題。如果我從我的代碼刪除從命令行執行Java程序時收到「錯誤名稱」NoClassDefFoundError

Exception in thread "main" 
java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ) 
     at java.lang.ClassLoader.defineClass1(NativeMethod) 
     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
     at java.security.AccessController.doPrivileged(NativeMethod) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
Could not find the main class: ProgAudioJ. Program will exit. 

package es_2011; 

一切完美 每當我試着通過命令

java ProgAudioJ 

執行程序我得到這個錯誤。我該如何解決問題?

+0

你是什麼意思「,如果我刪除es_2011' - 從中​​刪除在哪裏? – akf 2011-02-09 23:14:15

+0

我的意思是代碼.. – MAX 2011-02-09 23:15:53

+3

我認爲你需要展示代碼來說明你的意思。 – DaveJohnston 2011-02-09 23:19:13

回答

2

嘗試使用:(代替java ProgAudioJ

java es_2011.ProgAudioJ 

我在這裏對你當前的工作目錄和你的CLASSPATH做了一些假設。如果您可以提供關於您正在運行的命令的信息(例如,您所在的目錄,類文件的位置等),我們可以幫助您更高效地進行操作。

2

試試這個(編譯和運行):

DIR

2011-02-10 00:30 <DIR>   . 
2011-02-10 00:30 <DIR>   .. 
2011-02-10 00:27    58 es_2011 

的javac es_2011/ProgAudioJ

的Java es_2011.ProgAudioJ

1

這是相當明確提出有:

java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ)

如果你想要把一個類的包(*),然後將源代碼必須放置在相應的目錄,例如,

src/Main.java <- root package (no declaration) 
src/es_2011/ProgAudioJ.java <- package es_2011; 

(*),你應該總是這樣做,除了小丟棄的東西,可能是主要的類。

44

因爲我發現這些答案不清楚,所以這裏是你需要做的。 首先,如果你打包你的代碼(IE你的類的頂部有package關鍵字),編譯後的類必須位於與代碼中的包聲明同名的目錄中。編好你的課後,你需要當你執行java命令時向上移動一個目錄,並且你的包含了包的名字。例如,如果在/myFolder/myPackage/存在你的代碼,你的類package myPackage開始(請注意,目錄和包裝都是一樣的名字),然後你會做以下(LINUX/OSX):

cd /myFolder/myPackage 

javac MyClass.java 

cd .. 

java myPackage.MyClass 

編輯 - 後期編輯,以澄清我看到人們感到困惑的東西。在上面的例子中,這個包只有一個深度,這意味着它只是myPackage。如果你的代碼有更大的包,就像

package com.somedomain.someproject; 

你將需要從包含該包的根目錄的目錄執行java命令。例如,如果你的編譯代碼是mycode的/ COM/somedomain/someproject/MyMainClass.class,那麼你會從mycode的文件夾執行java命令,像這樣的(同樣,特別要注意的是,目錄結構是一樣的包聲明):

cd /myCode 
java com.somedomain.someproject.MyMainClass 
0

,當你刪除
package es_2011
它的工作原理的原因是,你正在改變編譯器如何包起來,並有效地定位,該文件。

我有同樣的問題 - 和錯誤消息wrong name:確實指向你的答案。您正在使用錯誤的名稱「ProgAudioJ」來運行.class文件。 它已被打包爲

es_2011/ProgAudioJ

爲了運行它 - 你必須要麼向上移動目錄:

如果您現在的位置:(Windows)中 src\es_2011\
舉動 src\

然後運行線路:

java es_2011.ProgAudioJ

這告訴編譯器尋找駐留在es_2011包中的ProgAudioJ。對於標準安裝,這將基於文件夾 - 因此它將首先查找es_2011文件夾,然後查找要運行的.class文件的名稱(ProgAudio)。

0

試試這個,

  1. 使用以下命令 

    $ javac ProgAudioJ.java -d . 
    
  2. 通過命令來運行你的應用程序編譯類

    $ java es_2011.ProgAudioJ