播放应用程序中不可能的NullPointerException

时间:2012-06-08 10:33:22

标签: java playframework nullpointerexception

我得到了一个非常奇怪的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框架应用程序的一部分,但我不认为这可能是问题的一部分...... 由于我已经测试了文件无效,因此它不能为null。如果在listFiles()方法中发生了错误,我希望在stacktrace上看到它。

那么可能是什么问题?

修改

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

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

感谢大家的帮助。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

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

  

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