0

所以我有以下代码:

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);

它在我使用安装了 Java 1.6 的 Windows 的开发机器上运行良好。但是,当我将类移植到将要运行的 unix 框并尝试运行它时,我在 FilenameFilter 行上得到一个 ClassNotFoundException。unix 盒子上也有 Java 1.6,所以我不知道问题出在哪里。这并不是什么大问题,因为有多种方法可以完成同样的事情,但我只是好奇是否有人对为什么它不能在 unix 机器上工作有任何想法。

我也尝试在 unix 机器上编译代码,以查看是否有任何区别,但没有。代码在 unix 机器上编译得很好,但我仍然收到同样的错误。有人有什么想法吗?

更新

我弄清楚了这个问题。显然,当我在其中编译包含该类的代码时,它创建了一个附加的 .class 文件,其中包含我的类的名称并在其上附加了 $1。所以我有Test.class 和Test$1.class。一旦我保留了 Test$1.class 文件,事情就会正常工作。我猜它需要第二个类文件,因为我创建了内部类?至少我认为这是一个内部阶级。

无论如何,谢谢大家的帮助。

4

1 回答 1

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(不要忘记进行备份,你也可以通过提取并通过检查是否FilenameFilter.class存在)rt.jarjava/io/

于 2012-05-24T18:29:02.153 回答