Java:为什么需要我初始化一个原始的局部变量?编辑:

2022-09-01 12:26:49
public class Foo {
    public static void main(String[] args) {
        float f;
        System.out.println(f);
    }
}

print 语句导致以下编译时错误:

局部变量 f 可能尚未初始化

如果Java中的基元已经具有默认值(float = 0.0f),为什么我需要定义一个?


编辑:

所以,这有效

public class Foo {
    float f;
    public static void main(String[] args) {
        System.out.println(new Foo().f);
    }
}

谢谢大家!


答案 1

因为它是一个局部变量。这就是为什么没有任何东西被分配给它:

局部变量略有不同;编译器从不将默认值分配给未初始化的局部变量。如果无法在声明局部变量的位置初始化局部变量,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

编辑:为什么Java会引发这个编译错误?如果我们看一下 IdentifierExpression.java类文件,我们会发现这个块:

...
if (field.isLocal()) {
            LocalMember local = (LocalMember)field;
            if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) {
                env.error(where, "invalid.uplevel", id);
            }
            if (!vset.testVar(local.number)) {
                env.error(where, "var.not.initialized", id);
                vset.addVar(local.number);
            }
            local.readcount++;
        }
...

如前所述(),JDK检查(with )变量是否被分配(Vset的源代码,我们可以在其中找到代码)。如果不是,则会从属性文件中引发错误:if (!vset.testVar(local.number)) {testVartestVarvar.not.initialized

...
javac.err.var.not.initialized=\
    Variable {0} may not have been initialized.
...


答案 2

实际上,编译器不会为 您的 分配默认值,因为在本例中,它是一个局部变量 -- 而不是一个字段:float f

局部变量略有不同;编译器从不将默认值分配给未初始化的局部变量。如果无法在声明局部变量的位置初始化局部变量,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。