Java 8のOptionalで例外をスローする

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を置きます。