學習 File.list(FilenameFilter) 時遇到 StackOverflowError: 遞歸太深。根因:自定義 FilenameFilter 實現類的構造器中 再次 new 自己,形成無限遞歸實例化。
public class FilenameFilterText implements FilenameFilter {
public FilenameFilterText() {
FilenameFilterText f = new FilenameFilterText(); // 死遞歸!
}
@Override public boolean accept(File dir, String name) { return true; }
}
public class FilenameFilterText implements FilenameFilter {
public FilenameFilterText() { /* 只做初始化,絕不 new 自己 */ }
@Override public boolean accept(File dir, String name) {
return name.endsWith(".txt"); // 實際過濾邏輯
}
}
// 使用
File dir = new File("G:/JavaFile");
String[] files = dir.list(new FilenameFilterText());
Files.walkFileTree (NIO.2) 或 Apache Commons IO FileUtils.listFiles,避免手寫遞歸出錯。一行多餘的 new FilenameFilterText() 就能把棧撐爆,切記切記。