我不知道为什么Sonar认为在下一行中可能会出现NullPointer异常:
if (file == null || file.listFiles() == null || file.listFiles().length == 0) {//etc}
你们有什么想法吗?
答案 0 :(得分:10)
扩展我的评论:
仅仅因为file.listFiles()
的一次调用返回非null并不意味着下一次调用必然会发生。您通常不能依赖于对同一方法的两次调用(在同一个对象上,使用相同的参数)来返回相同的值,并且返回引用类型值的任何方法原则上都可以返回null
。在反射时,您将认识到您经常依赖于为同一方法的不同调用获得不同的结果。因此,file.listFiles().length
始终是NPE的风险。
即使您希望Sonar具有File
类的特定知识(这似乎不一定合理),但是对于复合条件表达式的评估来说,真正有可能抛出NPE。所需要做的就是在file.listFiles()
的评估和file.listFiles().length
的评估之间删除引用的文件。
你可以纠正这个特殊问题:
File[] files;
if (file == null || (files = file.listFiles()) == null || files.length == 0) { /* ... */ }
当然,正如@zapi所说,如果file
可以修改并且其他线程可以访问,那么几乎所有的赌注都已关闭。