声纳:可能的空指针?

Sonar: Possible nullpointer?

不知道为什么Sonar认为下面一行可能会出现NullPointer Exception:

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

你们有什么想法吗?

扩展我的评论:

仅仅因为 file.listFiles() return 的非空调用一次并不意味着下一次调用一定会成功。您通常不能依赖对同一方法的两次调用(在同一对象上,使用相同的参数)return 相同的值,并且任何方法 returning 引用类型的值都可以,在原则,returnnull。经过反思,您会认识到您经常依赖于对同一方法的不同调用获得不同的结果。 file.listFiles().length 因此始终是 NPE 风险。

即使您希望 Sonar 具有 File class 的特定知识(这看起来不一定合理),复合条件表达式的评估确实有可能抛出 NPE .所有需要发生的是在 file.listFiles() 的评估和 file.listFiles().length 的评估之间删除引用的文件。

您可以像这样更正此特定问题:

File[] files;
if (file == null || (files = file.listFiles()) == null || files.length == 0) { /* ... */ }

当然,正如@zapi 所说,如果 file 是可修改的并且可供其他线程访问,那么几乎所有的赌注都没有了。