0

我遇到了这个非常简单的代码,在我看来,我们必须在声明它的同一范围内初始化一个变量,如果是这样,我不知道为什么。这是一个例子:

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变量,然后我在 for 循环中初始化为 3 的值。是什么导致错误?我错过了什么?xxx

作为旁注,非常相似的代码在 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 中使用 eclipse,在 C++ 中使用 Code::Blocks。

4

2 回答 2

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一些东西。如果确定将进入循环并分配一个值,那么不要担心初始化值是什么。否则,您现在明白为什么需要进行初始化了。

于 2013-01-05T05:53:04.770 回答
3

根据JLS 16(明确分配)

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

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

于 2013-01-05T05:52:45.103 回答