围绕try / catch访问而不是检查null?

时间:2018-01-10 10:48:21

标签: java exception null

我一直致力于一个代码库,其中以下结构很常见:

String value = null;

try {
    value = pojoClass.getValue().getANumberOfFunctions();
} catch (Exception e) {
    //ignore
}

if (value != null) {
    //stuff going on
}

要指出:如果pojo或其任何嵌套对象为null,则包围的代码只会抛出异常。内部没有数据库访问,或者比“get”函数链更复杂。

据我所知,抛出异常在性能方面比进行多次空检查更昂贵。我可以理解(直到某一点)这样做,如果为了简单起见有几个对象可能为null(虽然不是出于调试的缘故),但通常我看到的代码包含几行初始化,试试/捕获可以很容易地进入一个简单的if语句(通常“else”意味着什么都不做)。

我错过了什么,这是“懒惰的编程”,在我的理解之上有什么东西在这里发生了吗?

2 个答案:

答案 0 :(得分:2)

如果您使用的是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);
    });
}

答案 1 :(得分:1)

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

你应该只使用一个版本。