Java 对文件夹及其子文件夹中的txt文件计数的程序引发NullPointerException

Java 对文件夹及其子文件夹中的txt文件计数的程序引发NullPointerException,java,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.o

我在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;
    }
}
import java.io.*;
法杰洛维公务舱{
公共静态void main(字符串[]args)引发异常{
Fajlovi n=新的Fajlovi();
文件f=新文件(“D:\\”;
System.out.println(“txt文件的数量为”+n.listaj(f));
}
公共int listaj(文件f){
整数计数=0;
文件[]s=f.listFiles();
for(int i=0;i
File.listFiles()
如果在非目录的文件上调用,将返回null。如果发生这种情况,循环条件将导致
NullPointerException
。如果在不存在的文件上调用它,这是有意义的,正如您在最后提到的


发生这种情况的原因需要更多信息。什么是“您在[您的]计算机上找不到的文件?”

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

从有关列表文件()的文档中:

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

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

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;
}
File[]s=f.listFiles();
如果(s!=null){
对于(int i=0;i
当您的程序试图访问系统文件和文件夹下的安全目录时,它会引发NullPointerException。 在代码中,当
s[i].isDirectory()
变为
true
时,它开始探索
s[i]
目录,并且由于JVM无法访问该安全位置,它返回空值。 您可以检查目录是否为空,然后仅尝试在该目录中查找
.txt
文件。
希望此解释能回答您的问题。

此方法对我有效(在Win 7上运行):


您应该添加堆栈跟踪和导致异常的文件夹的名称。还应添加在哪个操作系统上运行此操作。如果可以运行调试器,则会有所帮助。或者,每次创建和使用对象时,都要输出对象的
toString()
并检查是否有空值,以确定错误是由您的代码引发的,还是由于系统库的[可能无效]输入引起的。@JonathanDrapeau看起来像Windows“文件f=new文件(“D:\\”)假设下面的答案之一不是答案,我自己没有时间调试这个问题,请查看这里的Java7 NIO教程,这可能会有所帮助。任何时候你试图获得理解异常的帮助,请包括你看到的完整消息和堆栈跟踪。没有这些,其他人很难调试你的问题accura泰利。这现在效果很好:)谢谢大家,请原谅我的问题不够精确。这是我在这里的第一篇帖子,下次会更好;)你是对的。谢谢你的解释。重点不是找到可以执行此操作的代码。我只是想知道为什么我的代码不起作用。
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;
    }
}