具有未经检查的异常的选项
Optionals with unchecked exceptions
考虑以下代码:
auditlog.getMessages()
.stream()
.filter(m -> messageId.equals(m.getMessageid()))
.findFirst()
.orElseThrow(NoMessageFoundException::new)
NoMessageFoundException
是一个自定义的未经检查的异常,从 RuntimeException
扩展而来。当 findFirst()
returns 一个空的可选时,我希望抛出 NoMessageFoundException
,但是,代码只是继续。
是否无法使用未经检查的异常来执行此操作?
我可以将 NoMessageFoundException
更改为已检查的异常,但随后我将不得不编写一个 try/catch
块或某种包装器来捕获异常,如 here 所述,但我希望不要那样做。
有什么想法吗?
可以抛出的异常类型没有限制。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
如果代码"carries on",表示找到了一条消息。
如果没有抛出异常是因为过滤操作后至少有一个元素剩余...
看这个例子:
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
....
考虑以下代码:
auditlog.getMessages()
.stream()
.filter(m -> messageId.equals(m.getMessageid()))
.findFirst()
.orElseThrow(NoMessageFoundException::new)
NoMessageFoundException
是一个自定义的未经检查的异常,从 RuntimeException
扩展而来。当 findFirst()
returns 一个空的可选时,我希望抛出 NoMessageFoundException
,但是,代码只是继续。
是否无法使用未经检查的异常来执行此操作?
我可以将 NoMessageFoundException
更改为已检查的异常,但随后我将不得不编写一个 try/catch
块或某种包装器来捕获异常,如 here 所述,但我希望不要那样做。
有什么想法吗?
可以抛出的异常类型没有限制。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
如果代码"carries on",表示找到了一条消息。
如果没有抛出异常是因为过滤操作后至少有一个元素剩余...
看这个例子:
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
....