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");
    }
}

這樣就能主要關注業務代碼,而將異常邏輯集中處理。當然,實際開發中,異常情況很多,需要仔細設計各種異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章