猿问

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

我发现 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/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我会得到编译错误Compile The local variable map may not have been initialized。


我找到了一个答案,它不会在编译时出现,那么如何事先避免或发现这个问题呢?


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


森林海
浏览 158回答 1
1回答

潇湘沐

您似乎正在寻找的行为更有可能产生不必要的警告而不是帮助设计。类级别字段获得 JVM 分配的默认值是设计使然,这有很多原因,包括:可能直到对象构造之后才知道该字段的值。这是典型的,因为许多字段值只能在setters中设置。当前类本身可能不知道该值是什么。在这种情况下,设置值的责任在类之外,因此警告只是一种烦恼。如果该字段根本不会在当前类中使用怎么办?这是开发商的责任所在。只有你知道执行的顺序,只有你知道代码依赖什么数据,只有你有责任测试代码并确保它没有错误。
随时随地看视频慕课网APP

相关分类

Java
我要回答