【備忘録】NullPointerException との付き合い方
今まで、NullPointerExceptionが出てきたときは何となくで対応していました。
業務をこなしていく中で段々と何について怒られているのか分かってきたので、整理もかねて纏めていきます。
NullPointerException とは
NullPointerException とは『NullPointerException は、java.lang. RuntimeException クラスのサブクラスで Java プログラムの実行中に参照型変数を参照しようとした時に null 値であった場合、スローされるランタイム例外です。』とのことです。
要は、nullのものからはgetterとかは使えませんよ~みたいなことです。
次で具体的にまとめていきます。
具体例
例えば、下記のようなクラス型の配列を使用するとします。public class nullpo {
public static class inClass {
private Integer id;
private String subject;
}
public List<inClass> nullpoList;
}
このListの中身がきちんと入っている場合を考えます。
public class NullPointerExceptionSample {
public static void main(String[] args) {
nullpo nullpo = new nullpo();
List<inClass> nullpoList = new ArrayList<>();
inClass inClass = new inClass();
// List1つ目
inClass.setId(1);
inClass.setSubject("sample");
nullpoList.add(inClass);
// List2つ目
inClass.setId(2);
inClass.setSubject("sample2");
nullpoList.add(inClass);
// Listの中身を入れる
nullpo.setNullpoList(nullpoList);
中身が入っている状態で、参照するコードを書きます。
// Listを取得
List<inClass> List = nullpo.getNullpoList
// Listの中身を取得
int Id = List.get(1).getid();
String subject = List.get(1).getSubject();
この場合は、どのgetterも問題なく処理することが出来ます。
次にListがnullの場合を考えます。
public class NullPointerExceptionSample {
public static void main(String[] args) {
nullpo nullpo = new nullpo();
List<inClass> nullpoList = new ArrayList<>();
nullpoList = null;
nullpo.setNullpoList(nullpoList);
Listがnullの状態で、中身を参照します。
// Listを取り出す⋯⓵
List<inClass> List = nullpo.getNullpoList();
// Listの中身を取り出す⋯⓶
int id = List.get(1).getId();
String subject = List.get(1).getSubject();
この場合⓵は正しく処理することが出来、nullが変数Listに代入されます。
しかし、⓶の処理ではnullポで落ちてしまいます。
つまり、参照した結果「null」が返ってくる場合はOkなのですが、
「null」事態を参照することはNGですよ、ということです。
nullポをネット上で調べると、nullのString型変数の長さを参照する例が多かったです。
ここで書いたことと言ってることは同じなのですが、座学をすっ飛ばして業務に入った自分自身はnullを参照するまでのステップが多くなるとそのシンプルな理屈と結び付けられなかったので、今回はあえて少し複雑目な例を考えてみました。
まとめ
今回はNullPointerExceptionを纏めていきました。開発中にnullポが発生してしまったら、以下の2つの観点で対応が必要かと思います。
1つ目が、仕様上は参照元がnullにならないはずである場合です。この場合はテストデータや、そこに至るまでのプログラムコードが間違っていることが考えられるので、それについての見直しが必要です。
2つ目が、仕様上その参照元がnullになる可能性を孕んでいる場合です。その場合、nullポチェックを実装する必要があります。
nullポチェックについては次回、纏めていきたいと思います。