我发现Java编译器和/或Sonar警告未完全涵盖防止忘记初始化对象的问题,我正在使用带有最新Sonar插件的最新Eclipse。
我遗漏了错误/警告,例如未初始化Map
(类似地可以是String
)
在示例Class Variable mapStatic
和Member Variable map
中,既是私有的也不是最终的,可以在没有初始化的情况下进行声明,而不会对{{1 }}来。
尽管对于局部变量NullPointerException
,我会遇到编译错误mapVar
显然是局部变量are not assign with default value,但是为什么编译器/声纳没有警告NullPointerException?
局部变量略有不同;编译器永远不会将默认值分配给未初始化的局部变量。
Compile The local variable mapVar may not have been initialized
如果我添加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不会在编译时,那么如何预先避免或发现此问题?
未能初始化值是程序员的逻辑错误,应尽快发现。 Java在本地时在编译时执行此操作,但在字段时仅在运行时(或根本不执行)。
答案 0 :(得分:2)
您似乎正在寻找的行为比帮助设计更有可能产生不必要的警告。
类级字段获取JVM分配的默认值的事实是设计使然,出于很多原因也可以,包括:
这是开发商的责任所在。只有您知道执行的顺序,只有您知道代码所依赖的数据,才有责任测试代码并确保其没有错误。