[經驗] 關於 Java 中的非空判斷


在寫項目的時候, 遇到一個問題

假設有一個控制層接口為:

    @ResponseBody
    @RequestMapping(value = "test", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    public Result<String> test(String user, String number, String time){
        String type="error";
        try{
            rType = SendType.create_send.toString();
            return firstSendService.createSend(type,uName, pNum, time);
        }catch (Exception ex){
            LOGGER.error(ex.getMessage(), ex);
        }
        return Result.failure(type, "fail of connect");
    }

前端在調用這個接口的時候, 並沒有傳遞參數, 於是  user, number, time 就默認為 null.

然后在服務層, 有一個方法

    public Result<String> createSend(String type, String user, String number, String time) throws Exception {
        String token = "not fond";
        try{
            if(user.isEmpty() && StringUtils.isBlank(user)){
                return Result.failure(type, "user is not null");
            }
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(user).append(time);
            String signChar = stringBuffer.toString();
            token = TokenUtil.sign(signChar);
        }catch (Exception ex){
            LOGGER.error(ex.getMessage(), ex);
        }
        return Result.success(type, token);
    }

其中, 關於參數的驗證中 

if(user.isEmpty() && StringUtils.isBlank(user)){
    return Result.failure(type, "user is not null");
}

這里的判斷條件並未被執行, 去驗證了一下 

  

換了一種方法

     

然后再來看看 StringUtils.isBlank();

 

再把 null 變成 "" 試試,

 

也沒什么問題, 那么再來試試看 StringUtils.isNotBlank();

如上圖所示, isNotBlank() 的判斷是跟 isBlank() 反過來的.

於是, 得出一個結論:

(0)  對於  isEmpty() , 當字符串為 "" 時, return true; 但是 isEmpty() 不能用於判斷為 null 的字符串, 會報 空指針異常 的錯誤,

所以 isEmpty()  更適合寫  if(str == "" && str.isEmpty()) { return }

 

(1) 相較於 isEmpty()  只能判斷 "" 的字符串, isBlank() 的功能性要更大更完善一些, 當字符串為 null 時, isBlank()  為 true; isNotBlank() 則跟 isBlank() 相反, 為 false.

所以 isBlank()  更適合寫 if( str == null && StringUtils.isBlank(str)){ return }  或者  if( str == "" && StringUtils.isBlank(str)){ return } 

 

但是

這樣是不行的, 看來 isBlank() 好像看起來要更加全能一些, 因為有時候參數有可能為 null, 也有可能為"" ,用 isBlank() 的話可以避免服務器停掉, 如何優雅的拋出錯誤或者異常, 且避免服務器的運行因此受到影響, 是我在努力的一個方向, 希望這些可以有些幫助

 

再補上一點 

 

這就奇怪了, 話說上面的 if( a.isEmpty() || StringUtils.isBlank(a)){ } 中, || 不是如果左邊不成功就使用右邊的判斷條件么? 為什么會直接報錯呢? 那如果是 || 的判斷是先判斷左邊, 那在 a == "" 的時候,為什么又可以成功運行? isEmpty() 這么坑的么?

 

再來一組對比

 

  

那還是強烈推薦使用  isBlank()  吧, "" 和 isEmpty() 是局限性有點大, 靈活性不夠高, 容易出事....

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM