java开发中处理null的烦恼

当业务代码的充斥着大量的null检查时,我真的感到很奔溃,我的业务逻辑真的就只有几行而已。下面的caller方法包含主要的业务逻辑。

private String getDevId(String id){
    String ret = queryDevIdFromDB(id);
    if (Objects.isNull(ret)) {
        return null;
    }
    return ret;
} 

private String queryDevIp(String devId){
    String ret = queryDevIpFromDB(id);
    if (Objects.isNull(ret)) {
        return null;
    }
    return ret;
} 

public long caller(String id) {
    //input check
    String devId = getDevId(id);
    if (Objects.isNull(devInfo)){
        Log.error("cannot find this dev: {}", id);
        return null;
    }

    String ip = queryDevIp(devId);
    if (Objects.isNull(ip)) {
        Log.error("cannot find ip by devId: {}", devId);
    }
    //do something using this ip
    return convertIpToLong(ip);
}

上述实例代码主要目的就是为了根据一个id查询设备的ip,但是充斥着大量的null检查,几乎就是C这种面向过程的编码,很影响阅读和维护。

既然java作为一种面向对象的高级语言,提供了异常机制,我们可以这样来设计这几个方法。

private String getDevId(String id){
    String ret = queryDevIdFromDB(id);
    if (Objects.isNull(ret)) {
        //运行时异常
        throw MyRTException("cannot find devId by id: " + id);
    }
    return ret;
}

private String queryDevIp(String devId){
    String ret = queryDevIpFromDB(id);
    if (Objects.isNull(ret)) {
        throw MyRTException("cannot find ip by devId: " + devId);
    }
    return ret;
} 

public long caller(String id) throw MyException {
    //ignore input check
    try {
        String devId = getDevId(id);
        String ip = queryDevIp(devId);
        //do something using this ip
        return convertIpToLong(ip);
    } catch (MyRTException mrte) {
        LOG.error("get ip failed: ", mrte);
        throws new MyException("get ip failed");
    }
}

这样就能主要关注业务代码,而将异常逻辑集中处理。当然,实际开发中,异常情况很多,需要仔细设计各种异常。

猜你喜欢

转载自blog.csdn.net/lx1848/article/details/81256430