«1. Введение

В этом уроке мы собираемся показать, как генерировать пользовательское исключение, когда необязательный параметр пуст.

Если вы хотите углубиться в необязательный, взгляните на наше полное руководство здесь.

2. Optional.orElseThrow

Проще говоря, если значение присутствует, то функция isPresent() вернет значение true, а вызов get() вернет это значение. В противном случае выдается исключение NoSuchElementException.

Существует также метод orElseThrow(Supplier\u003c? extends X\u003e exceptionSupplier), который позволяет нам предоставить собственный экземпляр Exception. Этот метод вернет значение, только если оно присутствует. В противном случае будет выдано исключение, созданное указанным поставщиком.

3. В действии

Представьте, что у нас есть метод, который возвращает результат, допускающий значение NULL:

public String findNameById(String id) {
    return id == null ? null : "example-name";
}

Теперь мы собираемся дважды вызвать метод findNameById(String id) и обернуть результат необязательным с помощью метода ofNullable(T value).

Необязательный параметр предоставляет статический фабричный метод для создания новых экземпляров. Этот метод называется ofNullable(значение T). Затем мы можем вызвать orElseThrow.

Мы можем проверить поведение, запустив этот тест:

@Test
public void whenIdIsNull_thenExceptionIsThrown() {
    assertThrows(InvalidArgumentException.class, () -> Optional
      .ofNullable(personRepository.findNameById(null))
      .orElseThrow(InvalidArgumentException::new));
}

В соответствии с нашей реализацией, findNameById вернет null. Таким образом, из метода orElseThrow будет выброшено новое исключение InvalidArgumentException.

Мы можем вызвать этот метод с ненулевым аргументом. Тогда мы не получим InvalidArgumentException:

@Test
public void whenIdIsNonNull_thenNoExceptionIsThrown() {
    assertAll(() -> Optional
      .ofNullable(personRepository.findNameById("id"))
      .orElseThrow(RuntimeException::new));
}

4. Заключение

В этой быстрой статье мы обсудили, как создать исключение из Java 8 Optional.

Как всегда, мы размещаем исходный код на нашем GitHub.