Выбросить исключение в необязательном в 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();
    }
}

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