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