从目录读取所有文件和嵌套文件时,线程“主”中的异常java.lang.StackOverflowError

时间:2018-07-08 17:29:02

标签: java stack-overflow java-io

通过这个程序,我试图读取给定文件夹位置中的所有文件,如果还有目录或子文件夹,则该程序也应该能够读取子文件夹中的文件。

此条件将读取所有文件:-if(listOfFiles[i].isFile()) 并且此else if(listOfFiles[i].isDirectory())条件表明是否存在任何子文件夹。 如果有子文件夹,那么我再次调用相同的方法。即:ft.fileChecker(s2);

但是在此步骤中,它将引发运行时错误。

//Main class
  public class FileCounter {
    public static void main(String[] args) {
    String s = "C:\\Users\\Nitk\\Desktop\\Project";    
    FileTester ftMain = new FileTester();
    ftMain.fileChecker(s);
}}

//----------
 import java.io.*;
 import java.util.*;
 public class FileTester {
    FileTester ft = new FileTester();
    public void fileChecker(String folderPath) {
        File f = new File(folderPath);
        File[] listOfFiles = f.listFiles(); 
        List<String> list = new ArrayList<>();
        FileLineCounter flc = new FileLineCounter();
        int count = 0;
        boolean isFound; boolean isFoundTxt;
        String s = null;                         
              for(int i =0; i < listOfFiles.length; i++){
                    if(listOfFiles[i].isFile()){
                        System.out.println(i +". File:" + listOfFiles[i].getName());
                        s = listOfFiles[i].getName();
                        list.add(s);
                       }else if(listOfFiles[i].isDirectory()) {
                      System.out.println(i +". Directory: " + listOfFiles[i].getName());
                      String s2 = folderPath+"\\"+listOfFiles[i];
                      ft.fileChecker(s2);
                   } 
            }              
       }     
  } 

Output:
--------
 Run-time error: 
 Exception in thread "main" java.lang.StackOverflowError
    at FileTester.<init>(FileTester.java:3)
    at FileTester.<init>(FileTester.java:4)
 ...
    at FileTester.<init>(FileTester.java:4)
    at FileTester.<init>(FileTester.java:4)
  C:\Users\Nitish\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
   BUILD FAILED (total time: 0 seconds)       

2 个答案:

答案 0 :(得分:2)

当您调用类FileTester的构造函数时,字段ft被初始化。由于ft的类型为FileTester,因此初始化该字段意味着再次调用类FileTester的构造函数,该构造函数将初始化ft字段,该字段将调用初始化{{1}的构造函数}字段会调用构造函数...

简而言之,从类ft中删除了行FileTester ft = new FileTester();

答案 1 :(得分:0)

您的代码有2个缺陷。

  1. 如果您只需要使用该类的方法,即FileTester类中的Dont FileTester ft = new FileTester();,就可以在该对象中创建同一类的对象, 只需使用fileChecker()
  2. 遇到目录并调用fileChecker()时,您将错误的目录传递给该目录,您应该传递String s2 = folderPath+"\\"+listOfFiles[i].getName(); fileChecker(s2);