声纳:可能的空指针?
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
是可修改的并且可供其他线程访问,那么几乎所有的赌注都没有了。
不知道为什么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
是可修改的并且可供其他线程访问,那么几乎所有的赌注都没有了。