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

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/27951622/

10-12 22:47