"variable may not have been initialized"的设计合理性是什么?



众所周知,在Java中,在使用本地变量之前需要初始化它(参见JLS)

局部变量(§14.4,§14.14)在使用前必须明确给定一个值,通过初始化(§14.4)或分配(§15.26),以可验证的方式使用明确分配规则(§16)。

否则会出现编译器错误:

The local variable result may not have been initialized.

这个设计决策的合理性是什么?为什么编译器不自动将声明(例如int xdouble yString foo等)转换为用某个默认值(0、0.0、null)初始化的定义?这样做有缺点吗?

缺点是默认值可能不是您想要的-您可能刚刚忘记初始化本地变量,使用默认值可能会导致异常(或者更糟的是,只需运行即可创建一些难以跟踪的错误)

在这种情况下,强制出现编译器错误可以确保您更正问题,并明确地将其分配给您想要的任何对象。

同样的参数也可以应用于字段,但在读取值之前,要检查它们是否被分配了一个值要困难得多(在技术上也不可能),因为它们可以从任何地方访问或写入。因此,在这种情况下使用默认值而不是强制执行此规则是唯一明智的方法。

只是为了说明浆果单词。

int x;
float y;
y = 42/x;
String name;
print("Hello " + name);

可悲的是,这些都是不执行该政策的语言中最常见的错误之一。请记住,每个变量的默认值可能不同,这就是为什么由开发人员来设置它们的原因。

添加到@berry120答案-关于字段和变量之间的差异。

变量未初始化

"未初始化"状态的行为与final字段或变量的行为几乎相同,只是可以重新分配值(我将其作为"最终行为"引用)。所以它让你不要忘记在这样的分支中初始化它:

int x;
if(condition1){
    x = 10;
} else
if(condition2){
    if( condition3 ){
        x = 20;
    }   // else branch is missing here
} else {
    x = 40;
}

所以编译器会在这里提示我一个初始化错误。为什么不将final用于相同的目的,并为var设置默认值?更多打字&冗长+我可能想重新分配给这个变种。

字段的默认值

我认为,对于变量来说,有一个默认值是首选的,因为用"最终行为"初始化变量对于一个有很多构造函数的类来说可能是一件非常痛苦的事情。当你对这个类进行子类和/或使用循环引用时,它可能会变得非常痛苦。。。或者一个难题:如何初始化循环依赖项(最终字段相互引用)?。

因此,为实例字段设置"结果可能尚未初始化"似乎不切实际。

最新更新