声纳:可能的nullpointer?

时间:2015-09-15 19:34:02

标签: java exception nullpointerexception sonarqube

我不知道为什么Sonar认为在下一行中可能会出现NullPointer异常:

if (file == null || file.listFiles() == null || file.listFiles().length == 0) {//etc}

你们有什么想法吗?

1 个答案:

答案 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可以修改并且其他线程可以访问,那么几乎所有的赌注都已关闭。