首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java File.list() 遞歸過深異常:構造器中遞歸調用構造器導致無限循環

     編輯:程式設計綜合問答

學習 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() 就能把棧撐爆,切記切記。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved