我的项目中有一个复杂的模型结构<有时我必须从中获得深层次的价值。如下所示:
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是一件需要避免的事情,但在我的情况下,避免它不是一件开销吗?
如果可以重构代码并使每个方法返回可选的。可以避免空检查并尝试。。。接住
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
差不多吧。是否有一个属性,一些配置,一些设置,可以帮助做到这一点很容易请?不用添加太多锅炉代码。 谢谢。