2011-10-02 131 views
0

軟件包當屬於一個包一個類文件,然後 初學者

package PackageName; 

被包括在該文件中的源代碼。 所以當JVM通過寫

java PackageName.classfilename 

它被執行調用。

是否「package PackageName」保證jvm這個classfile屬於這個包? 因爲如果我們忽略了「包軟件包名」語句,則JVM還發現了類文件,但給

Exception in thread "main" java.lang.NoClassDefFoundError: Classfilename 
wrongname PackageName/ClassfileName 

這意味着JVM發現該文件,但不存在用於它認爲這個類文件有某種原因錯誤的名字。

回答

3

你的類的包聲明必須與你的代碼的文件夾結構相匹配。 JVM使用包從方法的可見性到解決兩個類可能具有相同名稱的情況的幾個「任務」。 NoClassDefFoundError實際上意味着JVM 不能通過找到包含您所提供軟件包的類。如果您省略類的包定義,並運行程序,如: java ClassFileName 只要您從類所在的文件夾運行java命令,JVM就會找到該類。

另外...軟件包名稱應該全部小寫,類名稱應該以大寫字母開頭。 :)當其他人閱讀你的代碼時,約定是非常有用的!

希望評論有幫助。

+0

謝謝先生。 非常感謝你 – user961690

+0

不客氣=) – pcalcao

1

類文件需要在文件系統上存在,與包名中定義的層次結構相同。如果您刪除了軟件包名稱,我相信您必須將jar文件的根文件夾中的文件用於「未命名」軟件包中。有可能您從源文件中刪除了包行,但仍將類定義保留在PackageName文件夾中。

+0

謝謝主席先生的回覆。 – user961690

+0

先生,我包含正確的包名稱並編譯創建類文件,將其放入包文件夾中。它正確執行。然後我刪除了類文件,jvm找不到它,因此出現了「線程中的異常」main「java.lang.NoClassDefFoundError:Classfilename」。然後,我編譯了沒有「包聲明」的源代碼,並將其帶入包文件夾。這次,jvm提出了「線程中的異常」主「錯誤名稱PackageName/ClassfileName」。因此,我認爲jvm找出該文件,但認爲它是一個錯誤的文件。謝謝先生 – user961690

+2

瑣事時間!這是javac和java可執行文件的要求,而不是Java語言或虛擬機。從技術上講,Java規範(JLS的7.2節和VM規範的2.7節)不需要源代碼樹來匹配包結構,這是一個實現決定。另一種存儲機制的例子是oracle db - 它將源代碼和字節碼直接存儲在數據庫中。 –