众所周知,在Java中,在使用局部变量之前需要初始化它(cf )。JLS)
在使用局部变量(§14.4,§14.14)之前,必须通过初始化(§14.4)或赋值(§15.26),以可以使用明确分配规则(§16)来验证的方式使用该值。
否则,将得到一个编译器错误:
The local variable result may not have been initialized.这个设计决策的合理性是什么?为什么编译器不自动转换声明(例如int x、double y、String foo等)使用默认值(0,0.0,null)初始化的定义?这样做有什么缺点吗?
发布于 2013-11-29 10:40:23
缺点是,默认值可能不是您想要的--您可能只是忘了初始化您的局部变量,然后使用默认值可能会导致异常(或者更糟的是,无论如何运行会造成一些很难跟踪的bug)。
在这种情况下,强制编译器错误可以确保您纠正了问题,并将其显式地分配给您想要的任何内容。
同样的参数可以应用于字段,但是在读取值之前检查它们是否被赋值(在技术上每种情况下都是不可能的),因为它们可以从任何地方被访问或写入。因此,在这种情况下使用默认值而不是强制执行这条规则是唯一明智的方法。
发布于 2013-11-29 10:54:15
只是为了说明浆果词。
int x;
float y;
y = 42/x;
String name;
print("Hello " + name);可悲的是,这些是语言中最常见的错误之一,而这些错误并没有强制执行该政策。记住,每个变量的默认值可能是不同的,这就是为什么由开发人员来设置它们的原因。
发布于 2013-11-29 12:22:14
将@berry120 120的答案添加到字段和变量之间的差异上。
未为变量初始化
“未初始化”状态的行为与final字段或变量的行为几乎相同,但可以重新分配值(我将将其称为“最终行为”)。因此,它使您不必忘记在这样的分支中初始化它:
int x;
if(condition1){
x = 10;
} else
if(condition2){
if( condition3 ){
x = 20;
} // else branch is missing here
} else {
x = 40;
}所以编译器会在这里提示我一个初始化错误。为什么不将final用于相同的目的,并为var设置一个默认值?更多的输入&详细的+我可能想重新分配到这个var。
字段的默认值
例如,我认为使用默认值作为首选变量,因为使用“最终行为”初始化变量对于具有许多构造函数的类来说可能是一个真正的痛苦。当你把这个类子类和/或使用循环引用时,它可能会变成真正的痛苦.或者一个谜题:How to initialize a circular dependency (final fields referencing each other)?。
因此,对实例字段进行“结果可能还没有初始化”似乎是不切实际的。
https://stackoverflow.com/questions/20283742
复制相似问题