Javaでは「値が入っていない変数を使おうとした時」にエラーになる。NetBeansでは次のようなエラーが表示される。
ちょっとややこしいので、どのような時にOK or NGになるかを解説する。
[OK] aに値が入っているのでエラーにならない
4 5 6 7 8 |
public int example01() { int a; a = 1; return a; } |
変数aに値が代入されているので問題ない。
[NG] aに値が入っていないのでエラーになる
11 12 13 14 |
public int example02() { int a; return a; } |
変数aに値が代入されてないので、13行目のreturnがエラーになる。
[NG] aに値が入らない場合があり得るのでエラーになる
17 18 19 20 21 22 23 24 |
public int example03() { double x = Math.random(); // xに0以上1未満の実数が入る。 int a; if (x < 0.5) { a = 1; } return a; } |
変数xが0.5未満の時は変数aに値が代入される(乱数については教科書P.199を参照)が、それ以外の時はaに値は代入されない。xが0.5未満かどうかは実行時に決まることだが、コンパイル時に「代入されない可能性」があればエラーになる。
[OK] aに値が入るのが確実なのでエラーにならない
27 28 29 30 31 32 33 34 35 36 |
public int example04() { double x = Math.random(); // xに0以上1未満の実数が入る。 int a; if (x < 0.5) { a = 1; } else { a = 2; } return a; } |
条件分岐があったとしても、全ての条件で代入していればエラーにならない。ただし、「全ての条件」とはコンパイラが判断できる条件のことなので、次の場合エラーになる。
[NG] aに値が入るのが確実だが、コンパイラが判断できないのでエラーになる
39 40 41 42 43 44 45 46 47 48 |
public int example05() { double x = Math.random(); // xに0以上1未満の実数が入る。 int a; if (x < 0.5) { a = 1; } else if (0.5 <= x) { a = 2; } return a; } |
「xが0.5未満」と「xが0.5以上」という条件をチェックしているので、このどちらかにしか当てはまらないが、コンパイラは「どのような条件か」についてはチェックしないので、「この2つの条件に当てはまらない場合」があり得ると判断しエラーになる。else節をつければ全ての条件について記述できるのでエラーにならない。