NullPointerException例外

Javaプログラミングでエラーが発生したときの対処方法などを簡単な例で紹介しています。
- Page 2 - << 先頭のページ< 前のページ次のページ >最後のページ >>



NullPointerException

このページには、以下のサンプルを掲載しています。 下の項目をクリックをすると各サンプルにジャンプします。 ※2週間以内の新着記事はNewアイコン、更新記事はUpアイコンが表示されます。

■NullPointerException ( Sample2_1.java )
  1. package sample.err;
  2. public class ErrSample2_2 {
  3.   public static void main(String[] args) {
  4.     String str = null;
  5.     if ( str.equals("") ) {
  6.       System.out.println("文字列strは、空文字です。");
  7.     } else {
  8.       System.out.println("文字列strは、空文字ではありません。");
  9.     }
  10.   }
  11. }
[ 実行結果 ]
Exception in thread "main" java.lang.NullPointerException
  at sample.err.ErrSample2_1.main(ErrSample2_1.java:7)

[ 解説 ]
このエラーもよく出るエラーのひとつです。このエラーは、空のオブジェクト変数にアクセスしたときに出力されます。 上記実行結果の青字部分は、発生した例外(エラー)で、赤字部分は、ソースコード上のエラー発生行になります。 ErrSample2_1.javaの7行目でエラーが発生しましたと言うことになります。 サンプルの場合、7行目でオブジェクト変数strの指す文字列の値が空かどうか判定しているのですが、strが空(null)の ためエラーが発生しています。
NullPointerExceptionの場合は、オブジェクトによって対処方法も異なります。下にあげる方法が必ずしも有効になるとは限りません。 あくまでも対処の一例として参考にしてください。

方法1
これは、文字列比較をする時に比較する文字列の片方が必ずnullでないと判っている場合に有効です。Sample2_1の場合、 オブジェクト変数strのequalsメソッドを使っていましたが、この例では、strをequalsメソッドの引数として与えています。 ""は、空の文字列を表しています。Javaでは、ダブルクォート(")で囲まれた部分は、文字列を表します。文字列は、Stringクラスの オブジェクトなので、当然Stringクラスのメソッドであるequalsが使えます。なので文字列比較の場合は、"固定文字列".equals(オブジェクト変数) の形にしてあげればたとえオブジェクト変数がnullであってもNullPointerExceptionを回避することが出来ます。 ただし、比較する文字列が両方ともオブジェクト変数で中身が実行時点でよくわからない場合は、この方法は使えません。
  1. package sample.err;
  2. public class ErrSample2_2 {
  3.   public static void main(String[] args) {
  4.     String str = null;
  5.     if ( "".equals(str) ) {
  6.       System.out.println("文字列strは、空文字です。");
  7.     } else {
  8.       System.out.println("文字列strは、空文字ではありません。");
  9.     }
  10.   }
  11. }

方法2
オブジェクト変数がnullだったらnullじゃないものに変更しちゃう。
ただし、エラーの回避は出来ますが、ロジック上正しいかどうかは別問題となります。
  1. package sample.err;
  2. public class ErrSample2_3{
  3.   public static void main(String[] args) {
  4.     String str = null;
  5.         str = str == null?"":str;
  6.     if ( "".equals(str) ) {
  7.       System.out.println("文字列strは、空文字です。");
  8.     } else {
  9.       System.out.println("文字列strは、空文字ではありません。");
  10.     }
  11.   }
  12. }

NullPointerExceptionは、よくでるエラーなのですが、エラーの中でもかなり厄介なエラーです。エラーを回避させる 事は、簡単に出来るのですが、それがロジック上正しいのかどうかは、よく吟味しないととんでもないエラーを引き起こします。 なかでも、一番厄介なのは、プログラムが正常に動作しているように見えるけど実はエラーというパターンです。 場当たり的なエラー回避を行っているとこのようなことが発生します。また、Javaでは、オブジェクトを数珠繋ぎにしたり 入れ子にして記述することがよくあるのですが、ここでNullPointerExceptionが発生すると原因の特定が難しくなります。 オブジェクトを数珠繋ぎに記述しないのもNullPointerExceptionを回避する有効な方法となります。
例えば下の場合
  1.     〜何かの処理〜
  2.     BufferedReader br = new BufferedReader(
                              new InputStreamReader(
                                new FileInputStream(
                                  new File("test.txt"))));
  3.     〜何かの処理〜
と言う書き方と
  1.     〜何かの処理〜
  2.     File file = new File("test.txt");
  3.     FileInputStream fis = new FileInputStream(file);
  4.     InputStream isr = new InputStreamReader(fis);
  5.     BufferedReader br = new BufferedReader(isr);
  6.     〜何かの処理〜
という書き方では、やっていることは同じなのですが、エラーが発生した場合、最初の例では、 どのオブジェクト生成にエラー発生原因があったとしてもエラー発生行は、2行目になります。 一方2番目の例では、エラー発生原因のあった行が素直に表示されるので原因の特定は、簡単になります。
- Page 2 - << 先頭のページ< 前のページ次のページ >最後のページ >>


最終更新日:2019/02/13

2015-03-01からの訪問者数
  697 人