在为可为null的可选对象引发异常时,我遇到了编译错误,要求我捕获或将异常声明为已引发,但NPE是不需要捕获的运行时异常。因此,基本上,orElseThrow行为与在Java 8之前引发异常是不同的。 这是功能还是错误?有什么想法吗?
无法编译:
protected String sendTemplate() {
String template = getTemplate();
return Optional.ofNullable(template).orElseThrow(() -> {
throw new NullPointerException("message");
});
}
这样做:
protected String sendTemplate() {
String template = getTemplate();
if (template == null){
throw new NullPointerException("message");
}
else return template;
}
答案 0 :(得分:3)
传递给Supplier
的{{1}}应该返回构造的异常,该异常与该方法的泛型签名有关,该方法声明抛出供应商返回的内容。由于您的供应商未返回值,因此JDK 8 orElseThrow
推断javac
并要求Throwable
的调用者来处理它。较新的编译器可以在这种情况下方便地推断出orElseThrow
并且不会产生错误。
仍然,正确的用法是
RuntimeException
但是无论如何这都是对protected String sendTemplate1() {
String template = getTemplate();
return Optional.ofNullable(template)
.orElseThrow(() -> new NullPointerException("message"));
}
的过度使用。您应该简单地使用
Optional
请参见requireNonNull(T, String)
和requireNonNull(T, Supplier<String>)
。
答案 1 :(得分:1)
更改此
protected String sendTemplate() {
String template = getTemplate();
return Optional.ofNullable(template).orElseThrow(() -> {
throw new NullPointerException("message");
});
}
由此:
protected String sendTemplate() {
String template = getTemplate();
return Optional.ofNullable(template).orElseThrow(() -> {
return new NullPointerException("message"); // <--- RETURN here
});
}
方法orElseThrow()需要一个供应商(例如,产生异常的东西)。您不能抛出异常,而只是创建它。