我发现 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 在编译时为本地人执行此操作,但仅在运行时(或根本不)为字段执行此操作。
潇湘沐
相关分类