0
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?

JavaのNullハンドリング

Posted at
  • 環境
    Java 11以上

数年ぶりにJava(サーバーサイド)を使う機会があり、Nullチェックの方法についてのメモ。
以下のようなクラスのオブジェクトのGetterにアクセスしたいが、オブジェクトもフィールドもnullかもしれない場合の実装方法について、検討してみた。

	@Data
	@AllArgsConstructor
	@NoArgsConstructor
	class SampleClass {
		private BigDecimal bd;
	}

よくある方法(やりたくない)

// ①nullだったら何らかの値にしたい場合
var str = (obj == null ? "" : (obj.getBd() == null ? "" : obj.getBd().toPlainString()));
System.out.println("str=" + str);

// ②nullだったら何もしたくない場合
if (Objects.nonNull(obj) && Objects.nonNull(obj.getBd())) {
	System.out.println("str=" + obj.getBd().toPlainString());
}

②については、apache.commons.lang3ObjectsUtilを使えるかと思ったが、実行時例外が発生する。

if (ObjectUtils.allNotNull(obj, obj.getBd())) { // これは可変長引数の受け渡し時にNPE
	System.out.println("str=" + obj.getBd().toPlainString());
}

Optionalを使用する方法

Kotlinだったら、obj?.bd?.toPlainString()とかletといったスコープ演算子で簡潔に対応できそうだが、現時点のJavaには存在しないためOptionalを使用。

// ①nullだったら何らかの値にしたい場合
var str = Optional.ofNullable(obj).map(SampleClass::getBd).map(BigDecimal::toPlainString).orElse("");
System.out.println("str=" + str);

// ②nullだったら何もしたくない場合
Optional.ofNullable(obj).map(SampleClass::getBd).ifPresent(bd -> {
	System.out.println("str=" + bd.toPlainString());
});


0
0
0

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
0
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?