2012-01-24 95 views
1

我正在關注Princeton website上的java教程。Java不會在終端java.lang.NoClassDefFoundError中運行程序

我跑debian sqeeze 64bit,我已經安裝了Sun的Java版本6.

我可以編譯,沒有任何問題,運行基本hello world程序,使用終端和Eclipse IDE。

的問題是:

,當我嘗試編譯並運行程序,這需要例如參數輸入:

public class RandomSeq { 
    public static void main(String[] args) { 

     // command-line argument 
     int N = Integer.parseInt(args[0]); 

     // generate and print N numbers between 0 and 1 
     for (int i = 0; i < N; i++) { 
      System.out.println(Math.random()); 
     } 
    } 
} 

我可以在Eclipse中運行這個把一個整數參數,但它在終端上不起作用。

我得到這個錯誤:

[email protected]:~/Documents/workspace/IOput/src/randomSeq$ java RandomSeq 21 Exception in thread "main" java.lang.NoClassDefFoundError: RandomSeq (wrong name: randomSeq/RandomSeq) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 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(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Could not find the main class: RandomSeq. Program will exit.

我試圖更新/etc/profile包括在PATH變量java-6-sun

我不確定,從這裏嘗試。

+0

您的類路徑不正確。 –

+0

你的主要課程是在默認包中嗎?你是否把它包含在另一個包中?如果是這樣,請不要將其保留在默認包中。 – Adrian

+0

你的源文件中有包定義嗎?如果是,轉到'src /'文件夾並在那裏執行程序(使用'randomseq.Randomseq'作爲類) – ZeissS

回答

2

顯然,您正嘗試從Eclipse項目的src文件夾運行程序。 src代表「來源」。程序的可執行版本(編譯後的類)不在src;它在bin,代表「二進制」,即機器代碼。

當使用命令行,你應該先編譯程序:

javac MyClass.java 

,然後運行它:

java MyClass 

但是,請不要做一個Eclipse項目的目錄結構中,或者您將創建額外的文件(類文件),Eclipse在此位置不是預期的。


此外,也許你是在一個包內。如果您位於其包文件夾中,則無法運行該類。您需要位於程序包層次結構的頂層。

例子:假設你的類是一個名爲mypackage包內。然後在someFolder/mypackage/MyClass.java你會碰到這樣的:

package mypackage; 

class MyClass { 
    ... 
} 

編譯代碼後,你必須在somefolder併發出shell命令:

java mypackage.MyClass 
1

看起來好像你的類有一個包

package randomSeq; 

public class RandomSeq { 

如果是這樣,那麼在啓動時它應該位於文件夾randomSeq和根該文件夾應該在您的類路徑中,並且調用時必須指定該包。

所以,如果你的.class文件是在斌/ randomSeq,那麼你可以用java命令斌運行randomSeq.RandomSeq 21

0

別爲我擔心的說法,因爲這將給予一個運行時間空指針異常。
問題是你的類路徑。

在運行java RandomSeq的目錄中創建一個列表(ls或dir)。 那裏有.class file。如果不運行javac RandomSeq.java首先生成類文件