如何在Optional

时间:2018-03-27 10:34:15

标签: java nullpointerexception java-8 optional

原始代码是

if(object==null){
  throw new CustomException(ErrorEnum.OBJECT_NULL)
}

现在我想使用Optional来处理NullPointerException。 就像这样

Optional.ofNullable(object).orElseThrow(()->{throw new CustomException(ErrorEnum.OBJECT_NULL);}

但这样做会使代码比原始代码长得多。也许我应该用第一种方法解决问题?

4 个答案:

答案 0 :(得分:3)

Optional.ofNullable(object).orElseThrow(() -> new CustomException(ErrorEnum.OBJECT_NULL));

如果您在Optional javadoc

中阅读了方法定义
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X extends Throwable

这表明您需要X的供应商,其中X扩展为Throwable。 Supplier是一个方法get的接口。由于它只有一个抽象方法,因此它是一个可以使用Lambda表达式实例化的功能接口。

由于它不需要参数,我们将执行() -> new CustomException("your error message");这将创建一个Supplier实例,当调用get时,它返回一个CustomException对象,我将其作为参数传递给{{ 1}}。

说了这么多,你不应该对这个用例使用Optional,因为它对你没有任何好处。

希望有所帮助:)

答案 1 :(得分:2)

我同意评论者和其他答案,他们说Optional在这里是不必要的。实际上,它反映了我在其他地方也给出的建议。在这种情况下,如果一个已经一个可以为空的变量object,那么它是相当环形的将它包装在Optional中只是为了抛出异常,并且当你观察到,它比原来的长。

要问的问题是,object中的引用来自何处?它是否来自另一个返回可空引用的方法?如果是这样,那么也许应该重构其他方法来返回Optional<T>而不是类型T的可空引用。

答案 2 :(得分:1)

Optionals旨在比引用对象或T的{​​{1}}类型的引用更安全,但只有正确使用它才会更安全或更好。给出的两个示例都是安全的,但使用Optional来单独替换null语句并不是更好。

另外,请注意,您应该提供所需的异常,而不是抛出异常。即。

if

应该是

orElseThrow(() ->{throw new CustomException(ErrorEnum.OBJECT_NULL);}

或更好

orElseThrow(() ->{return new CustomException(ErrorEnum.OBJECT_NULL);} 

那就是说,在这个特殊情况下,我会采用第一种方法。选项在正确使用时很有用,例如作为方法返回类型来包装可能存在或不存在的值以及代码文档。因此,在这种情况下,不需要使用它。

答案 3 :(得分:0)

您可以改用方法参考。此处也不需要throws子句。假设您的例外中不需要特殊消息,请尝试这样做。

Optional.ofNullable(object).orElseThrow(CustomException::new);