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コンパイラに通知することを期待してから、forループで値3に初期化しました。エラーの原因は何ですか?私は何が欠けていますか?intxxx

ちなみに、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 に答える