Java: ローカル変数は意味のない値で初期化してはいけない

投稿日:

何がダメなのか

もちろん「必要な値」で初期化するのはOKですが、 ローカル変数に特に意味もなく String str = null とか、 String str = "" という初期化をしてるコードを見ます。 自分の中では不要な値で初期化をしないのは常識だと思ってるのですが、 意外と書いている本がありません1

C言語を引きずっている

意味のない値で初期化する人は、C言語の経験者が多いと思います。 なぜなら、C言語では、ローカル変数の宣言時の値は不定だからです。 つまり、プログラムを実行するたびに値が変わる可能性があります。 もちろん、コンパイラで警告が出ますが。

問題は、C言語のこの慣習をJavaに引きずっていることです。

Javaでは、ローカル変数を初期化せずに使うと、コンパイルエラーになります。 すなわち、ローカル変数を意味のない値で初期化すると、 コンパイラが検知できるはずのバグを、検知できなくなります。

例えば以下のコードの場合2、0より小さい場合は空文字が出力されます。 これはおそらく意図した挙動ではありません。 もし、String str = ""; が、 String str; と書かれていた場合、 コンパイルエラーになります。

public void print(int i) {
  String str = "";

  if (i == 0) {
    str = "0です。";
  } else if (i > 0) {
    str = "0より大きい数字です。";
  }

  System.out.println(str);
}

もし、0より小さい場合に本当に空文字を出したい場合は、 以下のように書くほうがいいでしょう。 バグではなく、意図的に空文字を出していることが分かります。

public void print(int i) {
  String str;

  if (i == 0) {
    str = "0です。";
  } else if (i > 0) {
    str = "0より大きい数字です。";
  } else {
    str = "";
  }

  System.out.println(str);
}

絶対ありえないなら、IllegalArgumentExceptionを投げるのがいいでしょう。

public void print(int i) {
  String str;

  if (i == 0) {
    str = "0です。";
  } else if (i > 0) {
    str = "0より大きい数字です。";
  } else {
    throw new IllegalArgumentException("0より小さい数字を渡さないでください!");
  }

  System.out.println(str);
}

  1. 多分あると思いますが。 [return]
  2. 説明用のコードなので、汚いのは無視してください。 [return]

辞書