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可以修改并且可以被其他线程访问,那么几乎所有的赌注都会被取消.