2014-03-27 86 views
0

我试图用Java编写的代码:这个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

+4

是的,你没有初始化'a'。 – devnull

+0

'int a = 42;'也许? – devnull

+0

可能重复的[变量可能未被初始化错误](http://stackoverflow.com/questions/2448843/variable-might-not-have-been-initialized-error) – Drunix

回答

5

的循环可能无法运行(编译器不知道肯定),因此a可能未初始化。

在此循环不执行打印语句,只是分配:

for(;b<=10;b++) 
    a=b; 
System.out.println(a); //this will only run after the loop. 

在上述情况下,如果b是>循环前10则a=b;永远执行和打印声明将得到初始化a

我假设你的意思是这个:

for(;b<=10;b++) { 
    a=b; 
    System.out.println(a); 
} 

如果您打算在循环后打印a,它初始化为任何值是合适的,例如int a = 0;

+0

是的,这是我真正想明白的。我没有故意初始化'a'和你告诉我的解决方案,它一直给我正确的输出。但是我对循环的工作感到困惑,我仍然不明白为什么它会这样。每次循环迭代时,它应该给'a'赋值'b'。这是不是发生?请详细说明。 – Pinky

+0

@ user3467998是的,但是编译器不知道循环是否会迭代,也就是说它不知道'b'是否符合条件(编译器不那么聪明,并且不会这样做)几乎没有任何好处会增加很多复杂性)。 – Thomas

+0

谢谢非常清除我的困惑。我试图用'if'条件来代替'for'循环,编译器告诉我同样的事情。但是当我添加了“其他”部分时,程序编译得很好。如果(b <= 10)a = 5,那么'f1()'的代码为'if'的System.out.println(一); – Pinky

2

方法体内部的变量不分配默认值,就像他们为实例字段等

因此您int a声明,不与值初始化a,生成你的编译错误。

用默认值分配a以摆脱此。

...或声明它的方法体外:

static int a; 

static void f1() { 
    ... 
    System.out.println(a); // no errors 
} 
2

静态错误检查不是那么聪明。 它不知道你的循环会一直运行,因此你可以输出'a'而不需要初始化它。

这种类型的问题只在运行时被提取,所以它会提醒你。

0

初始化变量

由于是局部变量和上堆叠和可变堆栈存储器中创建不分配任何默认值创建局部变量。所以我们必须初始化局部变量。

相关问题