原始代码是
if(object==null){
throw new CustomException(ErrorEnum.OBJECT_NULL)
}
现在我想使用Optional
来处理NullPointerException
。
就像这样
Optional.ofNullable(object).orElseThrow(()->{throw new CustomException(ErrorEnum.OBJECT_NULL);}
但这样做会使代码比原始代码长得多。也许我应该用第一种方法解决问题?
答案 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);