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

标签 java compiler-errors initialization sonarqube sonarlint

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

我缺少关于未初始化的错误/警告,例如Map(同样可以是String)

在示例中Class Variable mapStaticMember Variable map,既是私有(private)的,又不是最终的,可以在没有初始化的情况下声明,并且不会出现任何有关 NullPointerException 的错误/警告。

尽管对于 mapVar 等局部变量,我得到编译错误 编译局部变量 mapVar 可能尚未初始化

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

Local variables are slightly different; the compiler never assigns a default value to an uninitialized local variable.

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它不会在编译时出现,那么如何避免或提前发现这个问题呢?

Failing to initialise a value is a logic error on the part of the programmer, and should be caught as soon as possible. Java does this at compile time for locals, but only at runtime (or not at all) for fields.

最佳答案

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

事实上,类级字段获得 JVM 分配的默认值是设计使然,并且出于多种原因,这是可以接受的,包括:

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

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

关于java - 避免未初始化的非最终成员类/类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52810496/

相关文章:

java - 在 CQ5 Archtype 中使用 JspC 时,在 Maven 项目中找不到 global.jsp?

Java泛型方法使用compareTo方法问题从集合中查找 'max'对象

c++ - 使用 Nvidia GPU Computing 工具包和 Cygwin with Eclipse 编译错误

java - 在 windows8.1 上编译 OpenGTS 失败

c++ - Cpp 中的私有(private)静态数据成员.. 只能在其定义时初始化,而类内初始化无效?

java - JTree 节点重命名保留用户对象

python给出一个E501 : line too long error

c++ - 除非所有字段都初始化为 0,否则 int 数组会给出疯狂的值,为什么?

c++ - 由于 header 中的特化初始化而避免重复符号?

java - Spring Boot 中 logback 中的 OWSAP ESAPI 日志记录支持