public class Foo {
public static void main(String[] args) {
float f;
System.out.println(f);
}
}
print 语句会导致以下编译时错误,
局部变量 f 可能尚未初始化
如果 Java 中的原语已经有一个默认值(浮点数 = 0.0f),为什么我需要定义一个?
Edit:
所以,这有效
public class Foo {
float f;
public static void main(String[] args) {
System.out.println(new Foo().f);
}
}
感谢大家!
因为它是一个局部变量。这就是为什么没有给它分配任何内容:
局部变量略有不同;编译器从不分配
未初始化的局部变量的默认值。如果你不能
在声明局部变量的地方初始化它,请确保
在尝试使用它之前为其分配一个值。访问一个
未初始化的局部变量将导致编译时错误。
编辑:为什么 Java 会引发此编译错误?如果我们看一下IdentifierExpression.javaclass 文件中,我们会找到这个块:
...
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++;
}
...
就像声明的那样 (if (!vset.testVar(local.number)) {
),JDK 检查(用testVar
) 如果变量被赋值 (Vset的源代码我们在哪里可以找到testVar
代码)。如果不是,则会引发错误var.not.initialized
from a 属性文件 :
...
javac.err.var.not.initialized=\
Variable {0} may not have been initialized.
...
Source
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)