如何在Optional中抛出自定义异常

Stu*_*dPz 9 java nullpointerexception optional java-8

原始代码是

if(object==null){
  throw new CustomException(ErrorEnum.OBJECT_NULL)
}
Run Code Online (Sandbox Code Playgroud)

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

Optional.ofNullable(object).orElseThrow(()->{throw new CustomException(ErrorEnum.OBJECT_NULL);}
Run Code Online (Sandbox Code Playgroud)

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

Sne*_*neh 11

Optional.ofNullable(object).orElseThrow(() -> new CustomException(ErrorEnum.OBJECT_NULL));
Run Code Online (Sandbox Code Playgroud)

如果您阅读了Optional javadoc 中的方法定义

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X extends Throwable
Run Code Online (Sandbox Code Playgroud)

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

由于它不接受任何参数,我们将这样做() -> new CustomException("your error message");这将创建一个实例,Supplierget被调用时它返回一个 CustomException 对象,我将其作为参数传递给orElseThrow.

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

希望有帮助:)


Ous*_* D. 7

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

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

orElseThrow(() ->{throw new CustomException(ErrorEnum.OBJECT_NULL);}
Run Code Online (Sandbox Code Playgroud)

应该

orElseThrow(() ->{return new CustomException(ErrorEnum.OBJECT_NULL);} 
Run Code Online (Sandbox Code Playgroud)

或更好

orElseThrow(() -> new CustomException(ErrorEnum.OBJECT_NULL));
Run Code Online (Sandbox Code Playgroud)

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


Stu*_*rks 6

我同意评论者和其他答案,他们认为Optional这里没有必要。事实上,它与我在其他地方给出的建议相呼应。在这种情况下,如果已经有一个可为空的变量object,那么将其包装在一个只是抛出异常的变量中是相当迂回的Optional,并且正如您所观察到的,它比原始变量长。

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