2013-01-05 27 views
0

我遇到了这个非常简单的代码,在我看来,我们必须在我们声明的同一范围内初始化一个变量,如果是这样的话,我对此感到困惑。这里有一个例子:我是否必须在Java中声明的同一范围内初始化一个变量?

class Test 
{ 
    public static void main (String[] args) 
    { 
     int x; // if initialize x to anything everything works fine 

     for (int i = 0; i < 3; i++) 
     { 
      x = 3; 
      System.out.println("in loop : " + x); 
     } 

     System.out.println("out of loop " + x); // expect x = 3 here, but get an error 
    } 
} 

以上代码生成此错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The local variable x may not have been initialized 

我很困惑,为什么发生这种情况。我期望int x告诉Java编译器,我将在声明为x的范围内创建一个int变量x,然后我在for循环中将x初始化为3。什么原因导致错误?我错过了什么?

作为一个侧面说明,非常相似的代码工作,我预计在C++

#include<iostream> 

using namespace::std; 

int main() 
{ 
    int x; 

    for(int i = 0; i < 3; i++) 
    { 
     x = 3; 
     cout<<"in loop : "<<x<<endl; 
    } 

    cout<<"out of loop : "<<x<<endl; //expect x = 3 here 

    return 0; 
} 

我使用的Java和Code :: Blocks的Eclipse进行C++。

+3

在C++中,x被初始化为垃圾。 Java对你的支持并不是让这种事情发生。 – DWright

+1

@DWright +1'-Wall'可能会指出这一点,不确定。 –

回答

4

编译器肯定不知道你要进入循环。所以x可能永远不会被初始化。

考虑:

class Test 
{ 
    public static void main (String[] args) 
    { 
     int x;      // x has no value 

     for (int i = 0; i < 0; i++) // Bogus bounds -> never enters loop. 
     { 
      x = 3;     // Never happens 
      System.out.println("in loop : " + x); 
     } 

     System.out.println("out of loop " + x); // x has no value here!! 
    } 
} 

来吧,初始化x东西。如果确定会输入循环,并赋值,那么不用担心初始化值是什么。否则,你现在看到为什么需要初始化。

+1

我喜欢永不输入循环的例子。非常感谢! – Akavall

3

JLS 16 (Definite Assignment)

For every access of a local variable or blank final field x, x must be definitely assigned before the access, or a compile-time error occurs.

在这种情况下,编译器不知道for循环,这就是为什么你看到的编译时错误。

相关问题