gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:52:08 26 4
gpt4 key购买 nike

我发现 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com