メソッドで宣言したローカル変数やクラスのメンバ変数を初期化せずに使うと ・・・ ?
今回の Tips では、そのような変数の初期化に関することを少し整理したいと思います。
インスタンス変数 (static をつけずに宣言)
インスタンスごとに異なる属性値を持つための変数。一般に使うメンバ変数はこちらです。
クラス変数 (static をつけて宣言)
クラスのすべてのインスタンスから共有する変数。java.Math クラスの PI などがそうです。
「静的変数」ということもあります。
初期化の扱い
明示的に初期化しないと、既定の値が初期値として入ります。
==> 数値の型には 0、boolean型には false、オブジェクト参照の変数には null が入る
==> 配列は、宣言だけした場合(下記例の eye)は配列変数に null が入る
new で場所を用意した場合(下記例の prs)は、各要素にその型の既定の初期値が入る(※)
class Health { // 初期化しないと
int age; // 0
double weight; // 0.0
double[] eye; // null
int[] prs = new int[2]; // 0, 0
String name; // null
boolean flg; // false
static int bmiStd; // 0
}
なお、オブジェクト参照の変数を null のまま参照しようとすると、NullPointerException が発生します。
初期化の扱い
ローカル変数は、自動で初期化されません。初期化しないまま参照しようとすると、コンパイル・エラーになります。
ただし、new で作成した配列は、上記の (※) と同じ扱いになります。
public void myMethod() { // 初期化しないと
int n; // 参照部でコンパイル・エラー
double d; // 参照部でコンパイル・エラー
String s; // 参照部でコンパイル・エラー
double[] ds; // 参照部でコンパイル・エラー
boolean[] flgs = new boolean[5]; //各要素にfalseが入る
// System.out.println( n );
// System.out.println( d );
// System.out.println( s );
// System.out.println( ds );
for( int i = 0; i < flgs.length; i++ )
System.out.println( flgs[i] );
}
n, d, s, ds は自動で初期化されないので、これらの変数を参照しようとすると、「初期化されていない可能性がある」というエラーになります(println のコメントをはずすと確認できます)。(今回のクイズはありません)