2012-05-24 14 views
0

所以我有以下代碼:當一臺Unix機器上的Java程序中使用的FilenameFilter,收到的ClassNotFoundException

File txtFileDir = new File(MAIN_DIR + "test"); 
FilenameFilter filter = new FilenameFilter() { 
    @Override 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".txt"); 
    } 
}; 
File[] txtFiles = txtFileDir.listFiles(filter); 

並能正常工作,使用Windows安裝Java 1.6的我的機器上。但是,當我將該類移植到unix盒時,它將運行並嘗試運行它,我在FilenameFilter行上得到一個ClassNotFoundException異常。 unix box上也有Java 1.6,所以我不知道這個問題會是什麼。這不是一個大問題,因爲有多種方法可以完成同樣的事情,但我只是好奇,如果有人有任何想法,爲什麼它不會在Unix上的工作。

我也嘗試編譯unix框上的代碼,以查看是否有任何區別,但沒有。該代碼編譯罰款unix框但我仍然收到相同的錯誤。任何人有任何想法?

UPDATE

我想通了這個問題。顯然,當我編譯帶有該類的代碼時,它創建了一個額外的.class文件,其中添加了我的類的名稱和$ 1。所以我有Test.class和Test $ 1.class。一旦我保持Test $ 1.class文件正常工作。我猜它需要第二個類文件,因爲我創建的內部類?至少我認爲這是一個內心階層。

無論如何,感謝您的幫助。

+2

檢查FilenameFilter.class是否存在於rt.jar中。安裝Java 6的事實並不重要。重要的是你用來運行程序的Java版本。 'java -version'會告訴你。 OTOH,FilenameFilter自JDK1.0起存在,所以你確定使用了java.io.FilenameFilter?什麼是確切的和完整的錯誤信息和堆棧跟蹤? –

+0

@JBNizet有效的點,但我使用Java 1.6。正如你所說,這個類從Java 1.0開始就已經存在了,所以它顯然就在那裏。我將添加確切的堆棧跟蹤。 – cardician

回答

1

正如評論中所述,您應該首先確認您使用的是與其他機器相同的版本。 另一個檢查的FilenameFilter是否有在你的路徑的方法是:

javap java.io.FilenameFilter

因此,如果上面的命令列表中的類名和的FilenameFilter的方法作爲

Compiled from "FilenameFilter.java" 
public interface java.io.FilenameFilter{ 
    public abstract boolean accept(java.io.File, java.lang.String); 
} 

隨後的FilenameFilter有沒有在你的路徑和不需要擔心版本。

但是,如果它給你錯誤,那麼最簡單的方法是複製rt.jar其中包含幾乎所有的(絕對必要)類文件,並與現有的rt.jar替換它,這可能會在/usr/include/jvm/....在那裏或者你可以find它(不忘記備份,您還可以通過提取並通過java/io/

+0

我在FilenameFilter上運行了javap,它確實返回你提到的內容。 – cardician

相關問題