2011-11-29 17 views
8

今天早上我正在爲我的java認證編寫一些練習程序,並注意到我錯誤地輸入了一個包名,所以它與java文件所在的子目錄不匹配。我編譯了期望出現錯誤的代碼,但編譯的所有內容文件 - 甚至沒有警告。不要包必須匹配java文件所在的子目錄嗎?

我搜索了一下,我讀的大部分頁面都說包名必須與子目錄相匹配。我的經驗表明情況並非如此。

當我試圖運行該程序時,它不起作用,因爲.class文件位於錯誤的目錄中。我把它移動到正確的目錄,並得到這個錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sample/directory 
/doesnt/even/exist/OtherPackageMemberModifiers (wrong name: com/sample/chap01/O 
therPackageMemberModifiers) 

所以我覺得我看到的是,Java代碼將編譯如果包和子目錄不匹配,但有如果你這樣做似乎不是一種運行代碼的方式。那是對的嗎?

+3

的現象包路徑和目錄路徑是多餘的顯示出其討厭的頭。編譯器可能會發出錯誤。但是,這不會是100%:package src.main.java.com.sample ...或package com.sample。 ......仍然不會引發任何錯誤。 Javac需要基於目錄(-d),它基本上是基於文件的。 –

回答

14

包名必須與目錄名相匹配才能正確找到文件。它不是在編譯時與某些編譯器(例如,javac)的目錄名稱相匹配,儘管其他(如Eclipse)至少會提供警告。

「如果你這樣做運行代碼的方式」是創建目錄結構並手動將它放在那裏 - 類文件本身是完全有效的。

請注意,如果您使用-d標誌,則無論源位置如何,javac都會爲您構建適當的目錄層次結構。例如:

javac -d bin ClassInPackage.java 

將創建bin下任何所需的目錄中ClassInPackage.java聲明的封裝相匹配。

說了所有的thise,我還是強烈建議您使源目錄匹配的包,即使你可以逃脫,沒有它:)

相關問題