我是否必须在Java中声明的相同作用域中初始化变量?

时间:2013-01-05 05:51:40

标签: 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编译器我将在声明int的范围内创建x变量x,然后我将x初始化为值{ for循环中的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;
}

我正在使用eclipse for java和Code :: Blocks for C ++。

2 个答案:

答案 0 :(得分: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 :(得分:3)

根据JLS 16 (Definite Assignment)

  

对于局部变量或空白最终字段x的每次访问,必须在访问之前明确分配x,否则会发生编译时错误。

在这种情况下,编译器不确定for循环,这就是你看到编译时错误的原因。