簡體   English   中英

從命令行運行java程序時,在線程“main”java.lang.NoClassDefFoundError'中出現異常

[英]'Exception in thread “main” java.lang.NoClassDefFoundError' when running java program from command line

我在這做錯了什么:

class Helo { 
   // main: generate some simple output 
   public static void main (String[] args) { 
      System.out.println ("Hello, world."); // print one line 
      System.out.println ("How are you?"); // print another 
   } 
} 

當我進入終端時,我做:

cd ~
javac Atempt2.java (//that's the file name) 
java Atempt2 

然后它給了我這個錯誤信息:

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

總而言之,這就是我所做的和所發生的事情:

david-allenders-macbook-pro:~ davidallender$ cd ~
david-allenders-macbook-pro:~ davidallender$ javac Atempt2.java
david-allenders-macbook-pro:~ davidallender$ java Atempt2
Exception in thread "main" java.lang.NoClassDefFoundError: Atempt2
david-allenders-macbook-pro:~ davidallender$ 

我是新手,所以請以非常簡單的方式解釋一下。

謝謝。

自從我完成任何java工作以來已經有一段時間了,但我很確定你的類名需要與你的文件名相匹配。

javac使用類名生成輸出而不是文件名。 因此它將生成一個Helo.class類文件。
java將取一個類名並在相應的類文件中調用main函數,這里是Hello.class。

拋出ClassNotFoundError是因為javac從未生成Atemp2類文件,因為源文件中沒有Atemp2類。

將您的Atempt2.java重命名為Hello.java以繼續,然后:

javac Helo.java
java Helo

請參閱此處以獲取更多討論和推理

更改:

class Helo

class Atempt2

在您的源文件中。

聲明類的.java文件必須具有與聲明的類名匹配的文件名。

文件名必須與文件中定義的public class的名稱匹配。 在這種情況下,您要么必須將文件命名為“Helo.java”,要么將該類重命名為Atempt2

這是從java編程開始的非常基礎。你編寫的任何程序文件的名稱必須與程序的公共類匹配。 在你的程序中,文件的公共類是Helo,所以你的文件名必須是Helo.java.Here編譯器能夠編譯但JVM將搜索Helo.class文件來運行。 因為沒有Helo.class文件,你在線程“main”中得到運行時異常異常java.lang.NoClassDefFoundError:Atempt2

補充約瑟夫的回答。

編譯器的參數( javac )是要編譯的文件的名稱(正如您所做的那樣)。

另一方面,虛擬機( java )獲取要執行其main方法的類的名稱。

一種選擇是

javac Atempt2.java    // the file name
java Helo             // the class name

通常,將文件命名為與類相同的方式是個好主意。 對於public class這是必須的(由編譯器檢查)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM