是否有一种更简单的方法可以在Java中取消引用可空引用?

时间:2013-05-21 06:07:13

标签: java coding-style nullpointerexception

请考虑以下代码段:

if (foo != null
 && foo.bar != null
 && foo.bar.boo != null
 && foo.bar.boo.far != null)
{
    doSomething (foo.bar.boo.far);
}

我的问题很简单:有更简单\更短的方法吗?

详细说明:有没有更简单的方法来验证链的每个部分,我想这与此类似..

if (validate("foo.bar.boo.far"))
{
    doSomething (foo.bar.boo.far);
}

6 个答案:

答案 0 :(得分:5)

也许那样?

if (FooUtils.isFarNotEmpty(foo)){
    doSomething (foo.bar.boo.far);
}

FooUtils

boolean isFarNotEmpty (Foo foo){
   return foo != null && 
          foo.bar != null && 
          foo.bar.boo != null && 
          foo.bar.boo.far != null;
}

答案 1 :(得分:2)

在我看来,这个表达是完美的,没有什么可以更简单

答案 2 :(得分:1)

为什么要使用公共实例变量,封装公共变量并为它们创建getter和setter,你可以在getter中执行这些检查,如果其中任何一个为null,你可以返回新的Object(),或者你可以在try-catch块中运行此语句但不推荐,

答案 3 :(得分:1)

如果这是您的API,请consider some advice

  

“我称之为十亿美元的错误。” - C. A. R. R. Hoare爵士   空引用的发明

答案 4 :(得分:0)

遗憾的是,你无法做到这一点。如果你问我,这是Java语言的问题。 Groovy有一个名为Safe Navigation Operator ?.的东西,专门用于此目的。这是我过去做过的两件事。

  1. Grisha已经给出的答案,所以我不再重复了
  2. Naively编写了访问它的代码,并将其包含在一个NPE的try / catch中。这是一个例子:

    try {
        if (foo.bar.boo.far != null) {
            //do something
        }
    } catch (NullPointerException e) {
        //do what you would do in an else
    }
    
  3. 我不是特别喜欢第二个选项,但我说如果它实际上使代码更清晰,请考虑使用它。

    有一次我使用的库是一个非常薄的XML模式包装器,我决定在这种情况下使用第二个选项。如果我没有,代码将更难维护,因为忘记空检查会很容易,并且它们会混淆重要的逻辑。我认为这是使用它的有效案例。

答案 5 :(得分:0)

请尝试此代码

try {
    if (foo.bar.boo.far != null) {
        //No object is null
    }
} catch (Exception e) {
    // some object is null and causes null point exception.
}