我遇到了一个非常奇怪的 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,因为路径不存在。我没有检查,因为在我的开发机器上程序运行良好,问题只出现在生产服务器中,但显然与代码中的其他部分有关......
感谢你的帮助。