6

これは、宿題として行っている小さなプログラムの一部です。

public Exam maxGrade() {
    Node p = firstNode;
    int max = 0;
    String name;
    while (p!=null) {
        if (p.info.getGrade()>max) {
            max = p.info.getGrade();
            name = p.info.getName();
        }
        p = p.next;
    }

    if (name==null)
        return null;
    else
        return searchByName(name);
}

したがって、先に進んでコンパイルすると、コンパイラは次のメッセージを出力します。

Student.java:127: エラー: (name==null) の場合、変数名が初期化されていない可能性があります

この問題は、4 行目を次のように置き換えることで簡単に解決できます。

String name = null;

これで、いくつかのロジックを見ることができます。しかし、私は本当に問題の背後にある仕組みを把握したいと思っています. つまり、コード内で変数を使用して何かを行っていることがわかった場合、コンパイラが変数が初期化されているかどうかをチェックするのは合理的だと思われますが、変数を初期化する必要があることは何もしていないと思います。

このような情報源によると、文字列 (または他のオブジェクト) 変数「名前」を宣言するだけで、既に null を指しています。では、なぜその値が null かどうかを単純にチェックすることが異常と見なされるのでしょうか? コンパイラは、割り当て以外の初期化されていない変数に対して行うことをエラーと見なしますか?

4

3 に答える 3

14

オブジェクト型のフィールドは、デフォルトで null に初期化されます。配列メンバーもデフォルトで null に初期化されます。

ローカル変数はそうではなく、明示的に初期化する必要があります。

これは良いことです。初期化されていない変数は、多くの場合、エラーを示しています。

Java言語仕様の第4章の「変数の初期値」から:

ローカル変数 (§14.4、§14.14) は、初期化 (§14.4) または割り当て (§15.26) のいずれかによって、使用前に明示的に値を指定する必要があります。 16)。

于 2013-05-18T20:37:40.117 に答える
1

コンパイラは、オブジェクトのnull値について何らかの仮定を行う場合、オブジェクトを初期化する必要があります。これは単なる (非常に有用な) 予防措置です。

于 2013-05-18T20:37:59.550 に答える