具有未检查异常的可选项

3
请看以下代码:

考虑下面的代码:

auditlog.getMessages()
    .stream()
    .filter(m -> messageId.equals(m.getMessageid()))
    .findFirst()
    .orElseThrow(NoMessageFoundException::new)
NoMessageFoundException 是一个自定义的未检查异常,继承自 RuntimeException。当 findFirst() 返回一个空的 Optional 时,我期望会抛出 NoMessageFoundException,但是实际上代码并没有抛出异常而是继续执行了。
使用未检查异常无法达到预期效果吗?
我可以将 NoMessageFoundException 改为已检查异常,但这样我就必须编写一个 try/catch 块或某种包装器来捕获异常,如此文所述(链接),但我不希望这样做。
有什么好的想法吗?

实现 Supplier<RuntimeException> 会导致 lambda 返回编译错误。方法引用中的返回类型错误:无法将 MappingFailedException 转换为 xxx - Homewrecker
你的代码看起来没问题。 - ΦXocę 웃 Пepeúpa ツ
2个回答

2

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

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

如果代码“继续执行”,则表示找到了一条消息。

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异常...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接