参照型変数と値が未定義の変数とnullと空文字
javaの 文字列 の、空文字 とnullとは同じものと勘違いしている人がいるので注意。
さらに、ややこしい事に、nullと「初期値が未定義である。」とは意味が異なる。
参照型
javaの データ型 には、 基本データ型 と 参照型 がある。
基本データ型はbyte,short,int,long,float, double,char,booleanの8つの型がある。
参照型は インスタンス や配列型)を指す。
基本データ型と参照型の違いとして、基本データ型には変数に値そのものが格納されるのに対して、 参照型の場合は、値の実体が格納されているメモリー位置を指し示す(参照する)値が格納されてる。
つまり、参照型変数にはデータそのものではなく、データの格納先(参照先)を示す値が入っている。
参照型にnullを代入すると、参照型の変数は何もオブジェクトを参照していない事を示す。(参照する値が無い事を示す。)
明示的に値を代入しなければ、変数には初期値としてnullが格納されていると思いがちであるが...。
(1).メソッド内で宣言した参照型変数に初期値が代入されていない場合
メソッド内で宣言した変数( ローカル変数 )では、宣言しただけでは初期値が代入されない。
初期値が代入されていないという事は、null値も代入されていない。
メソッド内で以下のコードを書くと、4行目と6行目でコンパイルエラーをおこす。
これは、変数を宣言しただけで値が代入されていないためである。
リスト1(初期値が代入されていない場合)
(2).文字列変数にnullを代入した場合
文字列変数にnullを代入した場合、変数は何も指していない値に初期化されている。
以下のコードは6行目で、コンパイルエラーにならないが、実行時エラーになる。
リスト2(nullを代入した場合)
(3).文字列変数に空文字を代入した場合
空文字は長さが0の文字列であり,nullとは異なる。
nullとは異なり、メソッドを実行しても実行時エラーにならない。
リスト3(空文字を代入した場合)
当然の事ではあるが、空文字は半角スペース(空白文字," ")とは異なる。
スペースではs.length()の値は1になる。
nullまたは空文字の判定
文字列が、nullまたは空文字であるかの判定に、一般的に以下のようなコードが使われる。リスト4(nullまたは空文字であるかの判定)
上記のコードのnullまたは空文字であるかの判定条件の順序を逆にすると、値がnullの場合に実行時エラーが発生するので注意。
リスト5(nullの場合に実行時エラー)
これはリスト4のコードが、文字列がnullの場合にショートサーキットによりequalメソッドが実行されないのに対して、 リスト5のコードではequalメソッドが実行されてしまうためである。((2).文字列変数にnullを代入した場合)
蛇足
余談ではあるが、.NETでは空文字を示すのにString.Empty,nullまたは空文字かの判定にIsNullOrEmptyがあらかじめ用意されている。
Microsoftの言語は節操もなくなんでもできてしまうが、これはこれで便利。