我发现 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中设置。
当前类本身可能不知道该值是什么。在这种情况下,设置值的责任在类之外,因此警告只是一种烦恼。
如果该字段根本不会在当前类中使用怎么办?
这是开发商的责任所在。只有你知道执行的顺序,只有你知道代码依赖什么数据,只有你有责任测试代码并确保它没有错误。
添加回答
举报
0/150
提交
取消