1. введение
В этом уроке мы покажем, как создать пользовательское исключение, когда Необязательный i s пустой.
Если вы хотите углубиться в Необязательно, взгляните на наше полное руководство здесь.
2. Необязательно.orElseThrow
Проще говоря, если значение присутствует, то isPresent() вернет true , а вызов get() вернет это значение. В противном случае он вызывает NoSuchElementException .
Существует также метод orElseThrow(Поставщик расширяет X> exceptionSupplier) , что позволяет нам предоставить пользовательский экземпляр исключения. Этот метод вернет значение только в том случае, если оно присутствует. В противном случае он вызовет исключение, созданное предоставленным поставщиком. расширяет X> exceptionSupplier)
3. В Действии
Представьте, что у нас есть метод, который возвращает нулевой результат:
public String findNameById(String id) { return id == null ? null : "example-name"; }
Теперь мы собираемся дважды вызвать наш метод findNameById(String id) и обернуть результат с помощью Необязательного , используя метод ofNullable(значение T) .
Необязательно предоставляет статический заводской метод для создания новых экземпляров . Этот метод называется nullable(значение T) . Тогда мы можем позвонить orElseThrow.
Мы можем проверить это поведение, выполнив этот тест:
@Test public void whenIdIsNull_thenExceptionIsThrown() { assertThrows(InvalidArgumentException.class, () -> Optional .ofNullable(personRepository.findNameById(null)) .orElseThrow(InvalidArgumentException::new)); }
Согласно нашей реализации, findNameById вернет null . Итак, новый Исключение InvalidArgumentException будет выброшено из метода orElseThrow .
Мы можем вызвать этот метод с ненулевым аргументом. Тогда мы не получим исключение InvalidArgumentException:
@Test public void whenIdIsNonNull_thenNoExceptionIsThrown() { assertAll(() -> Optional .ofNullable(personRepository.findNameById("id")) .orElseThrow(RuntimeException::new)); }
4. Заключение
В этой краткой статье мы обсудили, как создать исключение из Java 8 Необязательно.
Как всегда, мы поместили исходный код на наш GitHub .