こんにちは!フリーランスの長野です。
nullって処理していますか?null処理を行わなければ、NullPointerExceptionの例外が発生してプログラムが途中で止まってしまうことがよくあります。
そこでこの記事では、NullPointerExceptionについて
- NullPointerExceptionとは?
- NullPointerExceptionの回避方法
- Optionalを使う方法
など基本的な内容から、応用的な内容についても解説していきます。
今回はNullPointerExceptionについて、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
NullPointerExceptionとは?
NullPointerExceptionとは、null値の参照型変数を参照しようとした時に発生する例外です。
そもそもnullとは?
そもそもnullとは何か簡単におさらいしましょう。
nullとは参照型変数の値が定義されていない状態です。
参照型変数の値は参照するメモリ上のアドレスとその参照先の値を示します。
この参照するメモリ上のアドレスとその参照先の値が定義されていない場合、参照型変数の値はnullとなります。ですのでnullからはどんなメソッドも呼び出すことができません。
もしnullでメソッドを実行させようとしてすると、NullPointerExceptionの例外が発生します。
サンプルコードで確認しましょう。
public class NullPointerExceptionSample { public static void main(String[] args) { String str = null; System.out.println(str.length()); } }
実行結果:
Exception in thread "main" java.lang.NullPointerException at NullPointerExceptionSample.main(NullPointerExceptionSample.java:4)
NullPointerExceptionの回避方法
さきほどのサンプルコードのようにnullからメソッドを呼び出したり、nullが許容されていないメソッドの引数にnull値の参照型変数を指定するとNullPointerExceptionの例外が発生して、プログラムが途中で止まる不具合が発生します。
それを回避する方法として参照型変数がnullかどうかif文を使って判定する方法がよく使われます。
サンプルコードで確認しましょう。
public class NullPointerExceptionSample { public static void main(String[] args) { String str = null; try { if(str != null) { System.out.println(str.length()); } else { throw new NullPointerException(); } } catch(NullPointerException e) { e.printStackTrace(); } } }
実行結果:
java.lang.NullPointerException at NullPointerExceptionSample.main(NullPointerExceptionSample.java:8)
このサンプルコードでは、if文を使ってString型の参照型変数strがnullでない場合はstrからlengthメソッドを呼び出しstrの文字数を表示するようになっています。
そしてnullの場合はNullPointerExceptionの例外を発生させ、try-catch文でその例外を捕捉するようにしています。
try-catch文でthrowを使って例外を発生させる方法についてはこちらで詳しく解説していますので、ぜひ参考にしてください。
Optionalを使う方法
さきほどのサンプルコードのように参照型変数がnullかどうかif文を使って判定しました。
しかし、Java8からはOptionalクラスを使って記述することもできるようになりました。
String str = null; Optional<String> value = Optional.ofNullable(str);
Optionalについてはこちらで詳しく解説していますので、ぜひ参考にしてください。
まとめ
ここでは、NullPointerExceptionについて説明しました。
文字列や配列、リストなどの参照型変数はNullPointerExceptionの例外に対して、if文やOptionalクラスを用いて処理を記述する必要があります。
慣れて使いこなせることができるように、この記事を何度も参考にして下さいね!