4
class returntest
{
    public static void main(String...args)
    {
        int a;
        System.out.println(a); //Line 1

        int b[] = new int[10];
        System.out.println(b[1]); //Line 2
    }
}

変数が初期化されていない可能性があることを示すコンパイラ エラーが 1 行目で (明らかに) 表示されます。

すべての int 配列要素がデフォルトで 0 に初期化されることはわかっています (したがって、2 行目は正常にコンパイルされます) が、コンパイラが同じロジック (すべての int を 0 に設定する) を通常の (非配列) int 変数に適用できない理由が私の質問です。

コンパイラがそれを行うことを禁止する制限はありますか?

4

4 に答える 4

4

ステートメントのブロックで定義されたローカル変数は、使用前に必ず初期化する必要があります。

ただし、クラスの本体で直接定義されるメンバー変数は、オブジェクトの作成時に自動的に 0 に初期化されます。

便利なスレッドはこちら

于 2013-08-31T07:15:41.840 に答える
2

ここから:-

ローカル変数は少し異なります。コンパイラは、初期化されていないローカル変数にデフォルト値を割り当てません。宣言されているローカル変数を初期化できない場合は、使用する前に必ず値を割り当ててください。初期化されていないローカル変数にアクセスすると、コンパイル エラーが発生します。

于 2013-08-31T07:15:11.363 に答える
0

変数のスコープがローカルの場合、ローカル変数を初期化する必要があります。

ローカル/ブロック変数を宣言すると、デフォルト値が取得されませんでした。アクセスする前に何らかの値を割り当てる必要があります。そうしないと、コンパイラがエラーをスローします。

コードでわかるように

int a; //Gives error because not assigned any value

ローカル変数にリソースを割り当てるとき、Java はメモリに値を書き込みません。エラーが発生する理由は、Java が使用する前に値を与えることを確認するためです。Sun は、これが C コードで診断するのが難しい問題である可能性があることに気付きました。これは、コンパイラからの支援が得られないためです。そのため、コンパイル時にチェックすることにしました。

このリンクを参照してください

于 2013-08-31T07:13:32.517 に答える
0

これは言語設計上の決定でした。

ローカル変数をデフォルトで初期化すると、エラーが隠される可能性があります。ローカル変数の使用は、最初に設定する必要があることを意味します。設定を忘れたり、その時だけ設定したりする単純なケースifがキャプチャされます。

于 2013-08-31T07:20:30.263 に答える