Java 8のOptionalで例外をスローする
1. 前書き
このチュートリアルでは、Optional isが空の場合にカスタム例外をスローする方法を示します。
Optional, について詳しく知りたい場合は、こちらの完全なguideをご覧ください。
2. Optional.orElseThrow
簡単に言えば、値が存在する場合、isPresent()はtrueを返し、get() を呼び出すとこの値が返されます。 それ以外の場合は、NoSuchElementExceptionをスローします。
カスタム例外インスタンスを提供できるメソッドorElseThrow(Supplier<? extends X> exceptionSupplier)もあります。 このメソッドは、存在する場合にのみ値を返します。 それ以外の場合は、提供されたサプライヤによって作成された例外がスローされます。
3. 実行中
we have a method which returns a nullable result:を想像してみてください
public String findNameById(String id) {
return id == null ? null : "example-name";
}
次に、findNameById(String id)メソッドを2回呼び出し、ofNullable(T value)メソッドを使用して結果をOptionalでラップします。
Optional provides a static factory method for creating new instances. このメソッドはofNullable(T value)と呼ばれます。 次に、orElseThrow.を呼び出すことができます
このテストを実行して、動作を確認できます。
@Test
public void whenIdIsNull_thenExceptionIsThrown() {
assertThrows(InvalidArgumentException.class, () -> Optional
.ofNullable(personRepository.findNameById(null))
.orElseThrow(InvalidArgumentException::new));
}
私たちの実装によれば、findNameById はnullを返します。 したがって、新しいInvalidArgumentException は orElseThrow メソッドからスローされます。
null以外の引数でこのメソッドを呼び出すことができます。 そうすると、InvalidArgumentException:は取得されません
@Test
public void whenIdIsNonNull_thenNoExceptionIsThrown() {
assertAll(() -> Optional
.ofNullable(personRepository.findNameById("id"))
.orElseThrow(RuntimeException::new));
}
4. 結論__
この簡単な記事では、Java 8Optional. から例外をスローする方法について説明しました。
いつものように、ソースコードon our GitHubを置きます。