天天看點

Boolean.getBoolean問題記錄

不喜,勿噴。

概述

看過源碼後,就能清楚明白,很簡單的一個問題,本文記錄一下。幸好在釋出上線之前,自己在本地自測時,發現這個問題并修複。非常簡單的代碼,簡單到自以為是,根本不需要驗證,結果啪啪啪打臉。但若上線後,将是不可預知的損失與後果。告誡自己,一定要自測自測自測。

場景

​queryTo​

​​是一個​

​Map<String, Object>​

​​,裡面存有一個Boolean類型的資料鍵​

​key=cacheApi​

​,想要拿到這個鍵的值(布爾值),根據這個布爾類型的資料判斷走哪一個分支的邏輯。不同分支的邏輯差别十萬八千裡,是以此行代碼實際上很重要。

想都沒有想,直接寫下如下方法:

Boolean.getBoolean(queryTo.get("cacheApi").toString());      

代碼就這麼放着,沒送出沒上線。

後面在驗證流程邏輯時發現不對勁,才知道這一行代碼有問題,于是斷點調試,截圖如下:

Boolean.getBoolean問題記錄

WTF??明明是true,為啥會得到false?隻能看源碼

Boolean.getBoolean問題記錄

繼續:

Boolean.getBoolean問題記錄

源碼如下:

Boolean.getBoolean(queryTo.get("cacheApi").toString());

public static boolean getBoolean(String name) {
    boolean result = false;
    try {
        result = parseBoolean(System.getProperty(name));
    } catch (IllegalArgumentException | NullPointerException e) {
    }
    return result;
}

public static boolean parseBoolean(String s) {
    return ((s != null) && s.equalsIgnoreCase("true"));
}      

是以問題的核心在于​

​System.getProperty(name)​

​​,即​

​System.getProperty("true")​

​​,傳回​

​null​

​。

至于源碼為何要如此設計,想不通,不能了解。

MapUtils.getBoolean(queryTo, "cacheApi");      

結論