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

时间:2018-10-15 05:57:21

标签: java compiler-errors initialization sonarqube sonarlint

我发现Java编译器和/或Sonar警告未完全涵盖防止忘记初始化对象的问题,我正在使用带有最新Sonar插件的最新Eclipse。

我遗漏了错误/警告,例如未初始化Map(类似地可以是String

在示例Class Variable mapStaticMember Variable map中,既是私有的也不是最终的,可以在没有初始化的情况下进行声明,而不会对{{1 }}来。

尽管对于局部变量NullPointerException,我会遇到编译错误mapVar

显然是局部变量are not assign with default value,但是为什么编译器/声纳没有警告NullPointerException?

  

局部变量略有不同;编译器永远不会将默认值分配给未初始化的局部变量。

Compile The local variable mapVar may not have been initialized

如果我添加private static Map<String, String> mapStatic; // Missing compile/warning private Map<String, String> map; // Missing compile/warning public 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

我发现an answer不会在编译时,那么如何预先避免或发现此问题?

  

未能初始化值是程序员的逻辑错误,应尽快发现。 Java在本地时在编译时执行此操作,但在字段时仅在运行时(或根本不执行)。

1 个答案:

答案 0 :(得分:2)

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

类级字段获取JVM分配的默认值的事实是设计使然,出于很多原因也可以,包括:

  • 很可能直到对象构造之后才能知道该字段的值。这很典型,因为许多字段值仅在设置程序中设置。
  • 当前类本身可能不知道该值是什么。在这种情况下,设置值的责任不在类之内,因此警告只会很烦人。
  • 如果该字段根本不会在当前类中使用怎么办?

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