声纳:可能的nullpointer?

Gab*_*iel 6 java exception nullpointerexception sonarqube

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

if (file == null || file.listFiles() == null || file.listFiles().length == 0) {//etc}
Run Code Online (Sandbox Code Playgroud)

你们有什么想法吗?

Joh*_*ger 10

扩展我的评论:

仅仅因为一个file.listFiles()非null返回调用并不意味着下一个必然会这样做.您通常不能依赖于对同一方法的两次调用(在同一个对象上,使用相同的参数)来返回相同的值,并且返回值为reference类型的任何方法原则上都可以返回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) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

当然,正如@zapi所说,如果file可以修改并且可以被其他线程访问,那么几乎所有的赌注都会被取消.