[英]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.