可选throw需要NPE的throws声明

时间:2019-07-16 08:56:54

标签: java java-8 functional-programming

在为可为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;
}

2 个答案:

答案 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()需要一个供应商(例如,产生异常的东西)。您不能抛出异常,而只是创建它。