繁体   English   中英

如何在Optional中引发自定义异常

[英]How to throw custom exception in Optional

原始代码是

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

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

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

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

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扩展Throwable的X供应商。 供应商是与方法get的接口。 由于它只有一种抽象方法,因此它是一个功能接口,您可以使用Lambda表达式进行实例化。

由于不带任何参数,我们将执行() -> new CustomException("your error message"); 这将创建Supplier的实例,该实例将在调用get时返回CustomException对象,我将其作为参数传递给orElseThrow

说了这么多,您不应在此用例中使用Optional,因为它对您没有好处。

希望有帮助:)

我同意评论者和其他回答的意见,他们说这里不需要“ Optional 确实,它呼应了我在其他地方也提供的建议。 在这种情况下,如果一个人已经有一个可为空的变量object那么将其包装在Optional只是抛出一个异常就很round回,并且正如您所观察到的,它比原始对象更长。

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

与引用对象或null的类型T的引用相比,可选方法是更安全的替代方法,但是只有正确使用它,它才会更安全或更有效。 给出的两个示例都是安全的,但最好不要使用Optional来替换if语句,如图所示。

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

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

应该

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

或更好

orElseThrow(() -> new CustomException(ErrorEnum.OBJECT_NULL));

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

您可以改用方法引用。 同样, throws子句在这里不是必需的。 假设您的例外情况中不需要特殊消息,请尝试一下。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM