有时候我面对我必须编写一段这样的代码(通常,如果有嵌套,并且结构更复杂,但对于示例来说就足够了)

public void printIt(Object1 a){
  if (a!=null){
     SubObject b= a.getB();
     if (b!=null){
         SubObject2 c=b.getC();
         if(c!=null){
             c.print();
         }
     }
  }
}

当我不需要知道失败的原因并且如果某事为空时什么也不做,那么一种方法可能是
public void printIt(Object1 a){
    try{
      a.getB().getC().print();
    }catch (NullPointerException e) {
    }
}

第二种形式是否存在问题,例如性能或其他类型的问题?

最佳答案

异常版本(类似于使用Groovy的安全导航运算符?.的链)非常容易采用Demeter定律(或我称之为Demeter的“用词强烈”的建议)并使之成为您晚上的玩物。

类似地,嵌套很深的if-语句导致难以阅读的代码,并且在所有这些下面,都存在相同的“冲突”,并且这种方法的循环复杂性很高。

public void printIt(Object1 a) {
    if (null == a) {
        return;
    }

    SubObject b = a.getB();
    if (null == b) {
        return;
    }

    SubObject2 c = b.getC();
    if (null == c) {
        return;
    }

    c.print();
}

我宁愿在适当的地方看到LAM(小辅助方法)来封装支票,并且几乎完全不需要这个问题。

关于java - 在Java中尝试/捕获vs空值检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9758457/

10-11 22:32