计算文件夹及其子文件夹中的txt文件的程序会抛出NullPointerException

时间:2013-08-14 16:28:16

标签: java

我在Java编程方面没有多少经验,我尝试编写简单的程序,遍历某个目录及其子文件夹并计算txt文件。我使用过这段代码:

import java.io.*;
public class Fajlovi {

    public static void main(String[] args) throws Exception  {

        Fajlovi n=new Fajlovi();
        File f=new File("D:\\");

        System.out.println("Number of txt files is"+n.listaj(f));

    }

    public int listaj(File f){
        int count=0;
        File[] s= f.listFiles();

        for(int i=0;i<s.length;i++){

            if(s[i].isDirectory())
                count+=listaj(s[i]);
            else if(s[i].getName().endsWith(".txt")){
                count++;

            }
        }
        return count;
    }
}

问题是它有时会根据我指定的目录而工作,但通常会抛出NullPointerException并停止执行。我已经使用了一些命令来执行执行步骤,并且我发现在为某些目录调用count+=listaj(s[i])时它会停止,我甚至无法在我的计算机上找到它而且它没有隐藏。

4 个答案:

答案 0 :(得分:1)

当您的程序试图访问System Files和文件夹下的那些安全目录时,它会抛出NullPointerException。 在s[i].isDirectory()成为true的代码中,它开始探索s[i]目录,并且由于JVM无法访问该安全位置,因此返回null值。 您可以检查目录是否为null,然后只尝试在该目录中查找.txt文件。 希望这个解释能回答你的问题。

答案 1 :(得分:0)

如果在不是目录的文件上调用

File.listFiles(),则返回null。如果发生这种情况,您的循环条件将导致NullPointerException。如果你最后提到的,那就是调用它是有意义的。

为什么会发生这种情况需要更多信息。什么是[你]在[你的]电脑上找不到的文件?“

答案 2 :(得分:0)

当使用的目录/文件无效时,程序崩溃。

有关 listFiles()的文档:

  

如果此抽象路径名不表示目录,或者发生I / O错误,则返回{@code null}。

此代码应防止将来出现NullPointerExceptions:

File[] s = f.listFiles();
if (s != null) {
    for (int i = 0; i < s.length; i++) {

        if (s[i].isDirectory())
            count += listaj(s[i]);
        else if (s[i].getName().endsWith(".txt")) {
            count++;

        }
    }
    return count;
} else {
    System.out.println("Invalid directory");
    return 0;
}

答案 3 :(得分:0)

这种方法对我有用(在Win 7上运行):

import java.io.*;

public class txtCount
{

  public static void main(String[] args)
  {
     txtCount n=new txtCount();
     File f=new File("D:\\");

     System.out.println("Number of txt files is " + n.listAndCount(f));
  }

   public int listAndCount(File f)
   {
       int count=0;
       for (final File fileEntry : f.listFiles()) 
       {
          if (fileEntry.isDirectory())
          {
             count += listAndCount(fileEntry);
          }
          else if(fileEntry.getName().endsWith(".txt"))
          {
              count++;
          }
       }
       return count;
    }
}