不喜,勿噴。
概述
看過源碼後,就能清楚明白,很簡單的一個問題,本文記錄一下。幸好在釋出上線之前,自己在本地自測時,發現這個問題并修複。非常簡單的代碼,簡單到自以為是,根本不需要驗證,結果啪啪啪打臉。但若上線後,将是不可預知的損失與後果。告誡自己,一定要自測自測自測。
場景
queryTo
是一個
Map<String, Object>
,裡面存有一個Boolean類型的資料鍵
key=cacheApi
,想要拿到這個鍵的值(布爾值),根據這個布爾類型的資料判斷走哪一個分支的邏輯。不同分支的邏輯差别十萬八千裡,是以此行代碼實際上很重要。
想都沒有想,直接寫下如下方法:
Boolean.getBoolean(queryTo.get("cacheApi").toString());
代碼就這麼放着,沒送出沒上線。
後面在驗證流程邏輯時發現不對勁,才知道這一行代碼有問題,于是斷點調試,截圖如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICciV2dsQXYtJ3bm9CX0gTMx81dsQWZ4lmZf1GLlpXazVmcvwVZnFWbp1zczV2YvJHctM3cv1Ces0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3kjNzQWOzUmNmVzNkRWNzYzX3AjN0kDMwMzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
WTF??明明是true,為啥會得到false?隻能看源碼
繼續:
源碼如下:
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");