请考虑以下代码:
auditlog.getMessages()
.stream()
.filter(m -> messageId.equals(m.getMessageid()))
.findFirst()
.orElseThrow(NoMessageFoundException::new)
NoMessageFoundException
是一个自定义未经检查的例外,从RuntimeException
延伸。当findFirst()
返回一个空的可选项时,我希望抛出NoMessageFoundException
,但代码只会继续。
使用未经检查的例外情况是否无法做到这一点?
我可以将NoMessageFoundException
更改为已检查的异常,但是我必须编写try/catch
块或某种包装来捕获异常,如here所述,但我希望不这样做。
有什么想法吗?
答案 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
....