在Java8中的可选项中抛出异常

时间:2017-03-24 07:08:08

标签: java java-8

有一种方法for (int i = 0; i < responseArrayList.count; i++) { postArrayList = [[responseArrayList objectAtIndex:i] valueForKey:@"post"]; for (int j = 0; j < postArrayList.count; j++) { return postArrayList.count; } } (我不能修改它)。此方法返回MyObjects,它必须位于try catch块中,因为get(sql)可能存在。我的代码是:

JqlParseException

我想删除try catch并使用String sql = something; try{ MyObject object = get(sql); } catch(JqlParseException e){ e.printStackTrace(); } catch(RuntimeException e){ e.printStackTrace(); } 类,我试过:

Optional

但IDE强制尝试捕获。  并为:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);

是一个错误(在IDE中)MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new)); 。有没有办法避免尝试catch块并使用可选的?

3 个答案:

答案 0 :(得分:34)

Optional并非真正用于处理异常的目的,它旨在处理潜在的空值而不会破坏程序的流程。例如:

 myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");

如果可选项为空,则会自动跳过map步骤,直接进入throw步骤 - 一个不错的完整程序流程。

当你写:

 myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));

...你真正说的是:返回我的可选值,但如果它不可用则抛出异常。

您似乎想要的是一种创建可选项(立即捕获异常)的方法,并在您尝试使用可选项时重新抛出该异常。

答案 1 :(得分:8)

这不是Optionals的工作方式。它们不会使try-catch-blocks过时。但是,您可以引入一个新的包装函数,如下所示:

public Optional<MyObject> getMyObject(final String jql) {
    try {
        return Optional.ofNullable(get(sql));
    } catch (final JqlParseException e) {
        return Optional.empty();
    }
}

您将不再需要处理异常,但如果您获得一个空的Optional,则不会知道是否有错误。

答案 2 :(得分:1)

试试这个

Optional.ofNullable(result)
                .orElseThrow(() -> new GenericClientException("Request body is not valid", HttpStatus.BAD_REQUEST));