29
public class Foo {
    public static void main(String[] args) {
        float f;
        System.out.println(f);
    }
}

print ステートメントにより、次のコンパイル時エラーが発生します。

ローカル変数 f が初期化されていない可能性があります

Java のプリミティブに既にデフォルト値 (float = 0.0f)がある場合、なぜそれを定義する必要があるのですか?


編集:

だから、これはうまくいく

public class Foo {
    float f;
    public static void main(String[] args) {
        System.out.println(new Foo().f);
    }
}

みんな、ありがとう!

4

5 に答える 5

52

ローカル変数だからです。これが、何も割り当てられていない理由です:

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

編集: Java でこのコンパイル エラーが発生するのはなぜですか? クラスファイルを見ると、次のIdentifierExpression.javaブロックが見つかります。

...
if (field.isLocal()) {
            LocalMember local = (LocalMember)field;
            if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) {
                env.error(where, "invalid.uplevel", id);
            }
            if (!vset.testVar(local.number)) {
                env.error(where, "var.not.initialized", id);
                vset.addVar(local.number);
            }
            local.readcount++;
        }
...

( ) で述べたようif (!vset.testVar(local.number)) {に、JDK は ( を使用してtestVar) 変数が割り当てられているかどうかをチェックします (Vsetのソース コードでコードを見つけることができtestVarます)。そうでない場合は、プロパティ ファイルvar.not.initializedからエラーが発生します。

...
javac.err.var.not.initialized=\
    Variable {0} may not have been initialized.
...

ソース

于 2012-06-22T23:43:59.727 に答える
17

実際、コンパイラはデフォルト値を に割り当てませんfloat f。この場合、フィールドではなくローカル変数であるためです。

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

于 2012-06-22T23:43:44.960 に答える
8

クラス フィールド (finalとにかく非 1) はデフォルト値に初期化されます。ローカル変数はそうではありません。

フィールドの宣言時に値を割り当てる必要は必ずしもありません。宣言されているが初期化されていないフィールドは、コンパイラによって適切なデフォルトに設定されます。

したがって、次のような (非)finalフィールドf

class C {
  float f;
}

に初期化されますが0f、ローカル変数f

void myMethod() {
  float f;
}

ならないだろう。

ローカル変数は、言語によってフィールドとは異なる方法で扱われます。ローカル変数の有効期間は適切に設定されているため、初期化前に使用するとエラーになる可能性があります。フィールドはそうではないので、多くの場合、デフォルトの初期化が便利です。

于 2012-06-22T23:43:33.110 に答える
5

実際には、ローカル変数はスタックに格納されます。したがって、ローカル変数に存在する古い値を取得する可能性があります。これは、セキュリティ上の理由から大きな課題です。したがって、Java は、使用する前にローカル変数を初期化する必要があると言います。

于 2013-07-04T07:35:44.517 に答える
2

こんにちはみんなソリューションは簡単です。ヒープ メモリに格納される値はコンパイラ ベースのデータ型によって初期化されますが、ローカル変数はスタック メモリに格納されるため、明示的に初期化する必要があります。

于 2015-02-19T07:22:22.293 に答える