我得到了一个非常奇怪的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,因为路径不存在。 我没有检查,因为在我的开发机器上程序运行良好,问题只出现在生产服务器上,但显然与代码中的其他部分有关...
感谢大家的帮助。
答案 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)构造函数从此抽象路径名构造的。因此,如果此路径名是绝对的,那么每个结果路径名都是绝对的;如果此路径名是相对的,则每个结果路径名将相对于同一目录。