具有未经检查的例外的选项

时间:2018-03-20 10:33:49

标签: java exception-handling java-8 optional

请考虑以下代码:

auditlog.getMessages()
    .stream()
    .filter(m -> messageId.equals(m.getMessageid()))
    .findFirst()
    .orElseThrow(NoMessageFoundException::new)

NoMessageFoundException是一个自定义未经检查的例外,从RuntimeException延伸。当findFirst()返回一个空的可选项时,我希望抛出NoMessageFoundException,但代码只会继续。

使用未经检查的例外情况是否无法做到这一点?

我可以将NoMessageFoundException更改为已检查的异常,但是我必须编写try/catch块或某种包装来捕获异常,如here所述,但我希望不这样做。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

可以抛出的异常类型没有限制。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}

如果代码&#34;继续&#34;,则表示找到了消息。

答案 1 :(得分:1)

如果异常没有得到抛出是因为在过滤动作之后至少还有一个元素......

见这个例子:

public class ASFasf {
    public static void main(String[] args) {
        List<Integer> l = Arrays.asList(1, 2, 3, 4, 5);
        Integer iR = l.stream().filter(x -> x > 100).findFirst().orElseThrow(NoMessageFoundException::new);
        System.out.println(iR);
    }
}

class NoMessageFoundException extends RuntimeException {
    public NoMessageFoundException() {
        super("Opala!!");
    }
}

永远不会打印iR,并且会抛出NoMessageFoundException ....