当前位置: 首页 > 知识库问答 >
问题:

尝试catch VS long if()[重复]

谭灿
2023-03-14

我的项目中有一个复杂的模型结构<有时我必须从中获得深层次的价值。如下所示:

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

问题是,这些方法中的每一个都可能返回null,如果返回,我将得到null点异常。

我想知道的是如果我喜欢的话我应该写长一点吗

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个答案

糜博远
2023-03-14

如果可以重构代码并使每个方法返回可选的。可以避免空检查并尝试。。。接住

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(...);

因此,返回可选的

我希望这能有所帮助。

更新您可以使用方法引用执行相同的操作。

Optional<Result> result = something.getSomethongElse()
            .flatMap(SomethongElse::getSecondSomething)
            .flatMap(SecondSomething::getThirdSomething)
            .flatMap(ThirdSomething::getFourthSomething);
 类似资料:
  • 可能重复: Java等待并通知:IllegalMonitorStateException 有什么问题 投掷:

  • 尝试执行简单的insert into语句,但出现外键关系错误。 我收到的错误是“无法添加或更新子行:外键约束失败('example_1010命令orders_ibfk1用户 ID) 引用用户用户 ID')” 我想我需要使用一个“in子句”来绕过约束,但我不认为我使用它是正确的。

  • 鉴于: 我想尝试,并重试,连接到服务器3次才放弃。 我可以把整个try/catch放在一个循环中,但是这是否符合Java的“最佳实践”。从我对该主题的回忆来看,这将是对语句的误用。再说一次,我可能完全错了。你怎么认为?

  • 我不知道为什么try-catch语句不起作用: 这是代码,我只是想做InputMismatchException,以防有人输入无效的东西,如283479234729472983472984723或字符串等。 但是当我运行它时,我输入了这样的内容,它不让我用扫描仪再试一次,它只是跳到: 它没有给我进入另一个。

  • 我正在使用下面的Java(Spring 2.0)代码从Web服务读取响应: 但是,如果myUrl Web服务返回HttpStatus。错误的_请求(400),未将其分配给myResponse并引发错误,因此没有ResponseBy,我需要将请求包装在try-catch块中。这是正确的还是有办法解决这个问题?此外,这是否意味着myUrl Web服务永远不应该故意(通过编程)将myResponseOb

  • 差不多吧。是否有一个属性,一些配置,一些设置,可以帮助做到这一点很容易请?不用添加太多锅炉代码。 谢谢。