Выбросить исключение в необязательном в Java8
Существует метод get(sql)
(я не могу его изменить). Этот метод возвращает MyObjects, и он должен быть в блоке try catch, потому что JqlParseException
возможно JqlParseException
. Мой код:
String sql = something;
try{
MyObject object = get(sql);
} catch(JqlParseException e){
e.printStackTrace();
} catch(RuntimeException e){
e.printStackTrace();
}
Я хочу удалить try catch и использовать Optional
класс, я попробовал:
MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);
но сила IDE там тоже пытается поймать. И для:
MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));
является ошибкой (в IDE) The type JqlParseException does not define JqlParseException() that is applicable
. Есть ли способ избежать блокировки catch и использовать опционально?
Ответы
Ответ 1
Optional
самом деле не предназначено для устранения исключений, оно предназначалось для устранения потенциальных нулей без нарушения потока вашей программы. Например:
myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");
Это автоматически пропустит шаг map
если опциональный был пуст, и перейдите к шагу throw
- хороший непрерывный поток программы.
Когда вы пишете:
myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));
... что вы на самом деле говорите: возвращайте мое необязательное значение, но бросайте исключение, если оно недоступно.
То, что вы, кажется, хотите, - это способ создания необязательного (который мгновенно улавливает исключение) и реконструирует это исключение при попытке использовать необязательный.
Ответ 2
Это не то, как работают опции. Они не делают устаревшие блоки try-catch. Однако вы можете ввести новую функцию-обертку следующим образом:
public Optional<MyObject> getMyObject(final String jql) {
try {
return Optional.ofNullable(get(sql));
} catch (final JqlParseException e) {
return Optional.empty();
}
}
Вам больше не придется иметь дело с этим исключением, но вы не будете знать, была ли ошибка, если вы также получили пустой вариант.