为了账号安全,请及时绑定邮箱和手机立即绑定

避免未初始化的非最终成员类/类变量

避免未初始化的非最终成员类/类变量

森林海 2021-11-17 17:24:41
我发现 Java 编译器和/或声纳警告没有完全涵盖防止忘记初始化对象,我正在使用最新的 Eclipse 和最新的声纳插件。例如,我缺少关于未初始化的错误/警告Map(同样可以是String)在示例Class Variable mapStatic和Member Variable 中 map,private 和 not final 都可以在没有初始化的情况下声明,并且没有任何关于即将NullPointerException到来的错误/警告。虽然对于局部变量,因为mapVar我收到编译错误Compile The local variable mapVar may not have been initialized显然局部变量没有分配默认值,但为什么编译器/声纳不警告NullPointerException?局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。private static Map<String, String> mapStatic; // Missing compile/warningprivate Map<String, String> map; // Missing compile/warningpublic void  put() {    map.put("x", "1"); // NullPointerException    //Map<String, String> mapVar;    //mapVar.put("x", "1"); // Compile The local variable mapVar may not have been initialized}static {    mapStatic.put("x", "1"); // NullPointerException        }此外,如果我添加final我会得到编译错误Compile The local variable map may not have been initialized。我找到了一个答案,它不会在编译时出现,那么如何事先避免或发现这个问题呢?未初始化值是程序员的逻辑错误,应尽快捕获。Java 在编译时为本地人执行此操作,但仅在运行时(或根本不)为字段执行此操作。
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

您似乎正在寻找的行为更有可能产生不必要的警告而不是帮助设计。

类级别字段获得 JVM 分配的默认值是设计使然,这有很多原因,包括:

  • 可能直到对象构造之后才知道该字段的值。这是典型的,因为许多字段值只能在setters设置

  • 当前类本身可能不知道该值是什么。在这种情况下,设置值的责任在类之外,因此警告只是一种烦恼。

  • 如果该字段根本不会在当前类中使用怎么办?

这是开发商的责任所在。只有你知道执行的顺序,只有你知道代码依赖什么数据,只有你有责任测试代码并确保它没有错误。


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信