1

我遇到了一个非常奇怪的 NPE 异常。这是有问题的代码:

  private static int countRecurse(File file) {
        Preconditions.checkNotNull(file, "file argument");
        int entries = 0;
        for (File entry : file.listFiles()) {    //NPE on this line
            if (entry != null) {
                if (entry.isDirectory())
                    entries += countRecurse(entry);
                else
                    entries++;
            }

        }
        return entries;
    }

我在注释行收到 NPE 异常。这是我得到的堆栈跟踪:

java.lang.NullPointerException
        at controllers.StudyPreparation.countRecurse(StudyPreparation.java:103)
        at controllers.StudyPreparation.readDicomFiles(StudyPreparation.java:95)
        at controllers.StudyPreparation.access$100(StudyPreparation.java:30)
        at controllers.StudyPreparation$1.onReady(StudyPreparation.java:77)
        at play.core.j.JavaWebSocket$$anonfun$webSocketWrapper$1$$anonfun$apply$1.apply(JavaWebSocket.scala:48)
        at play.core.j.JavaWebSocket$$anonfun$webSocketWrapper$1$$anonfun$apply$

该代码是 Play 框架应用程序的一部分,但我认为这不是问题的一部分……因为我已经测试了文件是否为空,所以它不能为空。如果 listFiles() 方法内部发生错误,我希望在堆栈跟踪中看到它。

那么可能是什么问题呢?

编辑:

解决了检查文件是否为目录的问题...由于 file.listFiles() 返回 null,因此抛出 NPE。

即使没有在 javadocs 中记录,它也会返回 null,因为路径不存在。我没有检查,因为在我的开发机器上程序运行良好,问题只出现在生产服务器中,但显然与代码中的其他部分有关......

感谢你的帮助。

4

2 回答 2

3

来自 file.listFiles() 的 javadoc

Returns an array of abstract pathnames denoting the files in the directory 
denoted by this abstract pathname. 

If this abstract pathname does not denote a directory, then this method returns 
null. ...

所以file.isDirectory()在使用前检查是否file.listFiles()

于 2012-06-08T10:43:17.690 回答
2

由于 File 不是目录,可能会发生file.listFiles()返回。null

如果此抽象路径名不表示目录,则此方法返回 null。否则返回一个 File 对象数组,一个对应于目录中的每个文件或目录。结果中不包括表示目录本身和目录父目录的路径名。每个生成的抽象路径名都是使用 File(File, String) 构造函数从这个抽象路径名构造的。因此,如果这个路径名是绝对的,那么每个生成的路径名都是绝对的;如果此路径名是相对的,则每个生成的路径名都将相对于同一目录。

于 2012-06-08T10:48:03.460 回答