用尝试/捕获访问权限包围,而不是检查空值



我一直在研究一个代码库,其中以下结构非常常见:

String value = null;
try {
    value = pojoClass.getValue().getANumberOfFunctions();
} catch (Exception e) {
    //ignore
}
if (value != null) {
    //stuff going on
}

只是要指出:如果 pojo 或其任何嵌套对象为 null,则周围的代码只会引发异常。内部没有数据库访问权限,也没有比"get"函数链更复杂的任何其他东西。

据我所知,抛出异常在性能方面比执行几次空检查更昂贵。我可以理解(在一定程度上(这样做,如果有几个对象为了简单起见可能为空(虽然不是为了调试(,但通常我看到的代码包含几行初始化,try/catches可以很容易地进入一个简单的if语句(因为通常"else"意味着什么都不做(。

错过了什么吗,这是"懒惰编程",这里有超出我理解范围的事情吗?

如果你使用的是Java 8,我建议使用Optional类。它允许您根据对象是否存在(非空(或以单行方式有条件地执行某些操作。例:

static class A {    
    private B b;
    public A(B b) {
        this.b = b;
    }   
    public B getB() {return b;}
}
static class B {
    private String s;
    public B(String s) {
        this.s = s;
    }
    public String getS() {
        return s;
    }
}
public static void main(String[] args) {
    A a1 = new A(new B("a1"));
    A a2 = new A(null);
    Optional.ofNullable(a1).map(A::getB).map(B::getS).ifPresent(s->{
        System.out.println(s);
    });
    Optional.ofNullable(a2).map(A::getB).map(B::getS).ifPresent(s->{
        //this won't be executed
        System.out.println(s);
    });
}

你呈现的只是糟糕的代码,是奇数球解决方案的变体:
同样的问题(这里检查null(以不同的方式解决。

您应该只坚持使用一个版本。

相关内容

  • 没有找到相关文章

最新更新