为了账号安全,请及时绑定邮箱和手机立即绑定

可选的 throw 需要 NPE 的 throws 声明

可选的 throw 需要 NPE 的 throws 声明

慕娘9325324 2023-03-31 09:24:40
当为可为 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 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

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


不过,正确的用法是


protected String sendTemplate1() {

    String template = getTemplate();

    return Optional.ofNullable(template)

        .orElseThrow(() -> new NullPointerException("message"));

}

但这是对Optionalanyway 的过度使用。你应该简单地使用


protected String sendTemplate() {

    return Objects.requireNonNull(getTemplate(), "message");

}

requireNonNull(T, String)requireNonNull(T, Supplier<String>)



查看完整回答
反对 回复 2023-03-31
?
白衣非少年

TA贡献1155条经验 获得超0个赞

改变这个


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()需要一个供应商(即创建异常的东西)。你不能抛出异常,只是创建它。



查看完整回答
反对 回复 2023-03-31
  • 2 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信