Java 如何处理多个空值?

Java 如何处理多个空值?,java,if-statement,Java,If Statement,假设我有一个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 so

假设我有一个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();
}
是否有一种优雅的方法来处理同一谓词?

您可以使用:

如果要使用默认值,也可以执行
orElseGet(D::new)

可以使用:


如果您想使用默认值,也可以执行
orElseGet(D::new)

您是否尝试过类似的操作

try {

    //Try and do something

} catch(NullPointerException e) {
    //Something was null, therefore an exception was thrown
}

你试过这样的东西吗

try {

    //Try and do something

} catch(NullPointerException e) {
    //Something was null, therefore an exception was thrown
}
在您的特定示例中,您正在抛出一个异常。在这种情况下,这显然是一个例外情况,因此我们可以使用异常来管理它:

D d;
try {
    d = a.getB().getC().getD();
}
catch (NullPointerException npe) {
    throw new SomeException(npe);
}
doYourStuffWith(d);
如果你没有抛出异常,你就不会这样做;您不希望对正常程序流使用异常。在这种情况下,您当前的检查没有问题,或者您可以对一系列
if/else
,或者在Java 8上下文中使用更具体的异常。:-)

在您的特定示例中,您正在抛出一个异常。在这种情况下,这显然是一个例外情况,因此我们可以使用异常来管理它:

D d;
try {
    d = a.getB().getC().getD();
}
catch (NullPointerException npe) {
    throw new SomeException(npe);
}
doYourStuffWith(d);

如果你没有抛出异常,你就不会这样做;您不希望对正常程序流使用异常。在这种情况下,您当前的检查没有问题,或者您可以对一系列
if/else
,或者在Java 8上下文中使用更具体的异常。:-)

我添加了一个缺少的
==null
我确定应该在那里,但如果我错了就回滚。我添加了一个缺少的
==null
我确定应该在那里,但如果我错了就回滚。@uı?假设OP抛出异常。如果这是错误的,那么我不确定OP是什么意思?如果你要指出什么,一定要说为什么我错了@uıɥɔɯ:这是一个完全错误的比较。我可以告诉你,你没有认真阅读和思考我说的话,所以我没有必要继续和你讲道理。无法对马进行插管。@GloryHunter问题是,你不必像aswer在catch块中所说的那样
抛出它
“有些东西是空的,因此抛出了异常”。那正是它所说的。你不需要抛出它。是的,这是我最大的问题。让我们扩展我原来的问题。我想进行5-6次服务调用,所有调用都返回复杂对象。然后,在这些服务调用之间存在容易出现空指针异常的操作。因此,现在,这段代码不是在翻译之前对响应进行净化,而是将我从NPE中解救出来,而不是我想要的。我知道这是有争议的,但最佳实践往往如此。@uıɥɔɯ:为什么?假设OP抛出异常。如果这是错误的,那么我不确定OP是什么意思?如果你要指出什么,一定要说为什么我错了@uıɥɔɯ:这是一个完全错误的比较。我可以告诉你,你没有认真阅读和思考我说的话,所以我没有必要继续和你讲道理。无法对马进行插管。@GloryHunter问题是,你不必像aswer在catch块中所说的那样
抛出它
“有些东西是空的,因此抛出了异常”。那正是它所说的。你不需要抛出它。是的,这是我最大的问题。让我们扩展我原来的问题。我想进行5-6次服务调用,所有调用都返回复杂对象。然后,在这些服务调用之间存在容易出现空指针异常的操作。因此,现在,这段代码不是在翻译之前对响应进行净化,而是将我从NPE中解救出来,而不是我想要的。我知道这是有争议的,但最佳实践往往如此。在现代Java环境中,这很好。很好,这是我需要的。这是谷歌番石榴,对吗?还是jdk8?@GloryHunter:jdk8,我添加了一个指向Peter答案的链接。在现代Java环境中,这很好。很好,这是我需要的。这是谷歌番石榴,对吗?还是jdk8?@GloryHunter:jdk8,我添加了一个指向Peter答案的链接。