我尝试用Java编译这段代码:
class D
{
public static void main(String arg[])
{
f1();
}
static void f1()
{
int a;
int b=5;
for(;b<=10;b++)
a=b;
System.out.println(a);
}
}
但是它会产生一个错误,上面写着:变量'a'可能尚未初始化。为什么会发生这种情况,尽管在for循环中设置了a
?
答案 0 :(得分:5)
循环可能无法运行(编译器无法确定),因此a
可能无法初始化。
这不会在循环中执行print语句,只是赋值:
for(;b<=10;b++)
a=b;
System.out.println(a); //this will only run after the loop.
在上述情况下b
是&gt;在循环之前,然后a=b;
永远不会执行,并且print语句将被初始化a
。
我认为你的意思是:
for(;b<=10;b++) {
a=b;
System.out.println(a);
}
如果您打算在循环后打印a
,请将其初始化为适当的值,例如: int a = 0;
。
答案 1 :(得分:2)
方法体内的变量不会像实例字段那样分配默认值等。
因此,int a
声明(不会使用值初始化a
)会生成编译错误。
为a
分配一个默认值以摆脱这个问题。
int a = 0;
...或在方法体外声明:
static int a;
static void f1() {
...
System.out.println(a); // no errors
}
答案 2 :(得分:2)
静态错误检查不是那么聪明。 它不知道您的循环将始终运行,因此您可以在不初始化的情况下输出“a”。
这种类型的问题仅在运行时被捕获,因此它会向您发出警告。
答案 3 :(得分:0)
初始化变量
int a = 0;
因为a是局部变量,并且在堆栈上创建局部变量,并且在堆栈内存上创建的变量不会分配任何默认值。所以我们必须初始化局部变量。