try..catch VS long if()

时间:2016-12-06 08:55:22

标签: java if-statement nullpointerexception

我的项目中有一个复杂的模型结构 有时我必须从中获取放置的值。它看起来如下:

something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();

问题是这些方法中的每一个都可以返回null,如果有的话,我会得到NullPointerException

我想知道的是,如果喜欢

,我应该写多长时间
if(something != null && something.getSomethongElse() != null && something..getSomethongElse().getSecondSomething() != null && something.getSomethongElse().getSecondSomething().getThirdSomething() != null && omething.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething() != null) {
    //process getFourthSomething result.
}

或者可以使用try..catch,如下所示:

SomethingFourth fourth = null;

try {
    fourth = something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();
} catch (NullPointerException e) { }

if(fourth != null) {
    ///work with fourth
}

我知道NPE是一件值得避免的事情,但在我的情况下避免使用它并不是一件好事吗?

1 个答案:

答案 0 :(得分:2)

如果您可以重构代码并使每个方法返回Optional。可以避免空检查并尝试... catch。

Optional<Result> result = something.getSomethingElse()
.flatMap(e -> e.getSecondSomething())
.flatMap(x -> x.getThirdSomething())
.flatMap(e -> e.getFourthSomething());
// at the end to check if result is present
result.ifPresent(..some_logic_here..); // or result.orElse(...);

所以getSomethingElse()会返回Optional<SomethingElse>getThirdSomething() - Optional<ThirdSomething>等等。我们必须在这里flatMap(Function<? super T,Optional<U>> mapper)使用,因为如果提供的映射器是一个结果已经是可选的映射器,并且如果被调用,则flatMap不会使用附加的Optional包装它。换句话说,如果map上的map(e -> e.getSecondSomething())结果类型为Optional<Optional<SecondSomething>>,我们就必须执行不必要的get()调用 - map(...).get().map(...)

我希望这会有所帮助。

<强>更新的 你可以使用方法引用做同样的事情。

Optional<Result> result = something.getSomethongElse()
            .flatMap(SomethongElse::getSecondSomething)
            .flatMap(SecondSomething::getThirdSomething)
            .flatMap(ThirdSomething::getFourthSomething);