4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Java8以降のNullPointerException 対策例(Optional)

Last updated at Posted at 2020-07-29

本稿について

Java8でNullPointerException の対策で新しいやり方が見つかっていますので自身の備忘的に書いておきます。

事象

早速ぬるぽ出してみます。

java

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関数の引数として、
いったん、変数vstrの中身を退避させて、System.out.pintline内で使う
このようなやり方をラムダ式(lambda expression)といい、Optionalと合わせてjava8より実装された新機能となります。

※ラムダ式についてまとめてある記事
https://engineer-club.jp/java-lambda-expression

ちなみにisPresentget()を使っているだめな例・・・(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が発生するのと同じです。

4
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?