2013-03-11 38 views
0

我已經編寫了一個Java類,它實現了在另一個目錄中指定的接口。我編譯應用程序是這樣的:在編譯時在類路徑上找到類,但在運行時找不到類

javac ArrayQueue.java -cp QueueArray 

ArrayQueue實現接口Queue目錄QueueArray。如果沒有指定的類路徑,編譯器會按預期拋出錯誤。

然而,運行程序後,該程序時,它不能再找到類:

java ArrayQueue -cp QueueArray 
Exception in thread "main" java.lang.NoClassDefFoundError: Queue 

什麼可能會導致這?

編輯:程序工作正常,如果我的.class文件複製到同一目錄ArrayQueue.class

+0

目錄結構和包聲明? – Thihara 2013-03-11 10:05:12

+0

您是否檢查過.class文件是否存在?您將在運行時需要.class文件。 – 2013-03-11 10:06:34

+0

@Thihara所有的類都在默認包中,其中main的文件是'ArrayQueue.java',而使用的類是'QueueArray/Queue.java'相對於主文件。 – Overv 2013-03-11 10:06:55

回答

1

這可能會有所幫助。從JLS, 3rd edition:Java平臺必須支持至少一個無名 包

的實現; 它可能支持多個未命名的軟件包,但不需要這樣做,但可以使用 。每個未命名的 包中的哪些編譯單元由主機系統確定。

在使用分層文件系統 用於存儲包Java平臺的實現,一個典型的策略是一個 未命名的包,每個目錄相關聯; 一次只能觀察到一個未命名包,即 ,即與當前工作目錄關聯的那個包。「當前工作 目錄」的確切含義取決於主機系統。

看來您使用的JVM不支持默認軟件包,除非它們與當前目錄相關聯,也就是您從中啓動您的自定義隊列類的目錄。

一般來說,使用默認包是一個壞主意,我的建議是將兩個類與一個包關聯,重新編譯並重新測試您的代碼。

0

使用java -classpath . class_having_main_method

+1

完全相同的錯誤和我的理解'-classpath'選項在這裏是多餘的。 – Overv 2013-03-11 10:01:08

相關問題