本稿について
Java8でNullPointerException の対策で新しいやり方が見つかっていますので自身の備忘的に書いておきます。
事象
早速ぬるぽ出してみます。
public class Test {
public static void main(String[] args) {
String str = null;
System.out.print(str.length());
}
}
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)
NullPointerExceptionが出てしまいました。
java8より実装された対処法として、Optional をつけてあげることで
NullPointer対処することができます。
下記のイメージで変更します。
import java.util.Optional;
public class Test {
public static void main(String[] args) {
// nullを代入
String str = null;
Optional<String> strOpt = Optional.ofNullable(str);
strOpt.ifPresent(v -> System.out.println(v.length()));
}
}
NullPointerException は出ずに無事処理終了しましたー
簡単な解説
java8以降でOptional
が実装されています
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html
Optional<String> strOpt = Optional.ofNullable(str);
strOpt.ifPresent(v -> System.out.println(v.length()));
上記のようにして、strをOptional
でラップしてあげることでofNullable()
関数を使うことができます。
ifPresent
関数の引数として、
いったん、変数v
にstr
の中身を退避させて、System.out.pintline内で使う
このようなやり方をラムダ式(lambda expression)といい、Optionalと合わせてjava8より実装された新機能となります。
※ラムダ式についてまとめてある記事
https://engineer-club.jp/java-lambda-expression
ちなみにisPresent
とget()
を使っているだめな例・・・(2020/07/31追記)
最初に下記の例を別パターンとして書いていましたが、下記のやり方は 万死に値する対処法 なようで、
自身への戒めを込めて悪い例として載せておきます。
こちらの記事をご覧頂くとお分かりいただけます
https://qiita.com/BlueRayi/items/ef46496ef2ef36b9cbb7
(※この記事を読むとそもそもOptional使ってのNullチェック自体ナンセンスなようですが。。)
import java.util.Optional;
public class Test {
public static void main(String[] args) {
String str = null;
Optional<String> strOpt = Optional.ofNullable(str);
if(strOpt.isPresent()) {
String message = strOpt.get();
System.out.println(message.length());
}
}
}
具体的には、if文内でisPresent()を使ってその値をget()というやり方は安易に実装できるが
Optionalを使うメリットを活かせておらず、isPresent()関数はやむを得ない場合の使い方、という捉え方をするのがよく、ニュアンス的に下記の記事がわかりやすそうです。
getを使用する機会は少ないはずです。
Optionalをわざわざ使用すると言うことは「値が入っていない場合はよしなにしてくれ」というメッセージです。
getを使用していきなり例外になるのなら、NullPointerExceptionが発生するのと同じです。