我们说我有一个SOA。现在我进行服务调用,我得到一个对象,它将嵌套对象作为字段。让我们说:
class A {
B b;
}
class B {
C c;
}
class C {
D d;
}
现在,如果我需要访问来自D类的字段,当我将对象作为来自服务调用的响应时,我需要执行:
if(a == null || a.getB() == null || a.getB().getC() == null || a.getB().getC().getD() == null) {
throw someexception();
}
是否有一种优雅的方式来处理相同的谓词?
答案 0 :(得分:10)
您可以使用Optional
:
D d = Optional.ofNullable(a)
.map(A::getB)
.map(B::getC)
.map(C::getD)
.orElseThrow(MyNullException::new);
如果您想使用默认值,也可以orElseGet(D::new)
。
答案 1 :(得分:1)
在特定的示例中,您将抛出异常。在这种情况下,这显然是一种特殊情况,因此我们可以使用例外来管理它:
D d;
try {
d = a.getB().getC().getD();
}
catch (NullPointerException npe) {
throw new SomeException(npe);
}
doYourStuffWith(d);
如果你没有抛出异常,你就不会这样做;你不想在正常的程序流程中使用异常。在这种情况下,您当前的检查没问题,或者您可以使用一系列if/else
或Java 8上下文do that lovely thing Peter showed us中的更具体的异常。 : - )
答案 2 :(得分:0)
你尝试过这样的事吗?
try {
//Try and do something
} catch(NullPointerException e) {
//Something was null, therefore an exception was thrown
}