java - 可选的 throw 需要 NPE 的 throws 声明

标签 java java-8 functional-programming

当为可空可选抛出异常时,我收到编译错误,要求我捕获或声明抛出的异常,但 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;
}

最佳答案

Supplier传递至orElseThrow应该返回构造的异常,这与该方法的通用签名相关,该方法声明抛出供应商返回的内容。由于您的供应商不返回值,因此 JDK 8 javac推断Throwable并要求调用者 orElseThrow来处理它。较新的编译器可以方便地推断 RuntimeException在这种情况下并且不会产生错误。

不过,正确的用法是

protected String sendTemplate1() {
    String template = getTemplate();
    return Optional.ofNullable(template)
        .orElseThrow(() -> new NullPointerException("message"));
}

但是这是对 Optional 的过度使用反正。您应该简单地使用

protected String sendTemplate() {
    return Objects.requireNonNull(getTemplate(), "message");
}

参见 requireNonNull(T, String) requireNonNull(T, Supplier<String>) .

关于java - 可选的 throw 需要 NPE 的 throws 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57053594/

相关文章:

java - 输入字符串中的格式异常 (Java)

java - 是否有 open-jdk-8 版本?如果有,如何获取?

java - 在 JDK 8 中,Nashorn 和新的 JSON-P (javax.json) API 之间是否有计划的互操作性?

while-loop - Kotlin - 将 while 循环转换为函数式样式

Java:非空方法作为映射值

Java iOS MDM : Get device which has removed the mdm payload or was erased to factory

java - 解压缩过程使设备无响应

java - 原始类型类的用途/目的是什么?

functional-programming - 具有多个文件的记录的可变字段

java - 如何最好地重构 Java 中的变量实例化重复?