nullとは
nullはヌルと読みます。その元はラテン語のnullusに由来していて「何もない」という意味です。英語で言うnothingにあたります。では「何でもない」とは一体なんなのでしょうか?
この答えにたどり着く前にもう一度変数の形について復習します。
基本データ型と参照型
今まで出てきた整数を表すintや文字を表すcharは基本データ型と言います。これらは情報量が値にかかわらず普遍です。例えばint型の変数に0を代入しようがint型で持てる最大値の2147483647を代入しようがすでん確保している変数の領域にすっぽりと収まってしまうのです。charにしてもどの文字を入れても1文字分の情報を保持しているので最初に確保した領域に収まります。
ところが参照型はその都度覚えておく情報量が変わります。参照型であるStringは0文字であることもあれば何万文字になることもあり得るのです。それこそネズミのための部屋と恐竜のための部屋くらい確保する量が変わってきます。このため実際の値はメモリという記憶領域に書き込んでおくのです。記憶領域が空いている限りいくらでも値を覚えておくことができます。
参照型の変数の値とはその場所の情報なのです。値を読んだり書いたりする必要があるときにメモリ上の値を参照したり上書きしたりします。
参照型の変数に参照する先がない場合
参照型は常にメモリ上に値を持っているとは限りません。必要ないときにはメモリ上の場所情報を持たないこともできます。これが「変数の値がnull」である状態です。参照型にnullを代入するには以下のようにします。
String nothing = null;
参照型の変数はオブジェクトとも呼ばれます。オブジェクトはある処理が定義されていたり、内部にさらに別の変数を持ったりしています。Stringオブジェクトに対しては文字列の長さを返す処理を呼び出すことができます。この処理のことをJavaではメソッドと言います。他の言語で関数と呼ばれるものと同じと考えて良いでしょう。
以下ではStringオブジェクトに対してメソッドを実行させています。
String five_letters = "abcde"; int value_is_five = five_letters.length();
“abcde”という文字列を値として持つ変数five_lettersが宣言されています。five_lettersの文字列の長さを返すメソッドlengthを実行しています。five_lettersの持つ値は5文字なので実行結果はint型で5になります。この値をint型で宣言されたvalue_is_five変数に代入します。value_is_five変数の値は5です。
ところが以下のようにnullを設定した変数はメソッドを実行することができません。
String nothing = null; int no_value = nothing.length();
lengthメソッドが呼ばれるとJavaはnothingの示すオブジェクトをメモリ上で探そうとします。しかし探そうにもnothingはnullつまり参照する場所の情報がない状態なのでメソッドを呼び出すオブジェクトが見つからず立ち往生してしまいます。この立ち往生の状態が発生すると処理は中断されて例外を発生させます。例外とはエラーの一種です。
このようにnullは「参照がない」状態を表現できる一方で扱いには注意が必要です。