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 .