初期化していない配列変数はnull
配列変数は宣言しただけでは中身は空ですので使用することはできません。この「空」という意味は少し注意が必要です。
初期化していない配列変数はnull 目次
1.配列は初期化しないと使用できない
配列変数を宣言しただけでは、中身は空なので使用することはできません。
package pac01; public class HelloWorld { public static void main(String[] args) { // int型の配列変数を宣言 int[] intArray; System.out.println(intArray[0]); } } ------------------------------------------------------------- Exception in thread "main" java.lang.Error: Unresolved compilation problem: ローカル変数 intArray が初期化されていない可能性があります at pac01.HelloWorld.main(HelloWorld.java:9)
7行目で宣言した配列を、9行目で使用しようとしていますが、初期化されていないのでエラーになっています。
配列変数の中には、配列オブジェクトの実体の場所を指し示す参照が格納されるのですが、まだ配列オブジェクトを作成していないので、参照も空になっています。
2.参照が空とは
参照が空とはどういう状態でしょうか。文字が空と言うと、空文字(ブランク)のことをイメージしますが、参照が空というのはnull(ヌル)と言います。nullとは、「値が何も存在しない状態」を指します。厳密に言うとブランクというのは、値は存在しています。例えば文字数は0であると言えますが、値が存在していなければそもそも文字数も何もないですよね。
このnullと言う考え方は非常に重要ですので良く覚えておきましょう。配列に限らず、参照型(クラス)の初期値はnullです。
空文字の場合、画面出力は可能(結局何も表示されませんが)ですが、nullの場合表示する値そのものが存在しないので、値を表示しようとしただけでエラーになります。もっと詳しく言うと、参照とはオブジェクトの実体が存在する場所を指し示しているので、配列変数の中に格納されている場所(WEBのリンクみたいなイメージ)を見に行こうとするが、そもそも場所を指し示す情報自体が無かったということになります。
ちなみに、この状態のことを「null参照」と言います。
3.明示的にnullにする
配列変数は宣言しただけでは中身はnullであると言いましたが、あえてnullで初期化する方法もあります。
package pac01; public class HelloWorld { public static void main(String[] args) { // int型の配列変数を宣言 int[] intArray = null; System.out.println(intArray[0]); } } ------------------------------------------------------- Exception in thread "main" java.lang.NullPointerException at pac01.HelloWorld.main(HelloWorld.java:9)
先ほどは、初期化をしていない変数を使用しようとするとそもそもコンパイルエラーが出てコンパイルができなかったのですが、今回はnullを代入していますのでコンパイルは通ります。しかし、9行目を実行する時にnull参照エラー(NullPointerException)が出てしまいます。こういうのを実行時エラーと言います。
ただ、このnullで初期化するというのは私は良くやります。もともと配列変数や文字列等はnullが初期値ですので、変数宣言時は明示的にnullを代入することで誰が見ても「初期値はnullだ」ということが分かります。
最近のコメント