Перейти к основному содержимому

Бросить исключение в необязательном порядке в Java 8

· 2 мин. чтения

1. Введение

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

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

2. Необязательный.orElseThrow

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

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

3. В действии

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

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

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

Необязательный предоставляет статический фабричный метод для создания новых экземпляров . Этот метод называется ofNullable(T value) . Затем мы можем вызвать 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 .