概述
看过源码后,就能清楚明白,很简单的一个问题,本文记录一下。幸好在发布上线之前,自己在本地自测时,发现这个问题并修复。非常简单的代码,简单到自以为是,根本不需要验证,结果啪啪啪打脸。但若上线后,将是不可预知的损失与后果。告诫自己,一定要自测自测自测。
分析
queryTo
是一个Map<String, Object>
,里面存有一个Boolean类型的数据键key=cacheApi
,想要拿到这个键的值(布尔值),根据这个布尔类型的数据判断走哪一个分支的逻辑。不同分支的逻辑差别十万八千里,所以此行代码实际上很重要。
想都没有想,直接写下如下方法:
Boolean.getBoolean(queryTo.get("cacheApi").toString());
代码就这么放着,没提交没上线。
后面在验证流程逻辑时发现不对劲,才知道这一行代码有问题,于是断点调试,截图如下:
WTF??
从map里直接get("cacheApi")
获取到的数据是true,为啥Boolean.getBoolean(queryTo.get("cacheApi").toString())
会得到false?
只能看源码
继续:
源码如下:
/**
* Returns true if and only if the system property named by the argument exists and is equal to, ignoring case, the string "true".
* A system property is accessible through getProperty, a
* method defined by the System class. If there is no property with the specified name, or if the specified name is empty or null, then false is returned.
*/
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"));
}
根据上述源码及Java Doc,问题的核心在于System.getProperty(name)
,即System.getProperty("true")
,返回null
。
至于为什么返回null,因为没有这个系统变量(system property),代码未提前设置。怎么设置呢?
System.setProperty(queryTo.get("cacheApi").toString(), "true");
然后才能获取:
Boolean.getBoolean(queryTo.get("cacheApi").toString());
这就有些无厘头。
Google搜索下来,参考Boolean.getBoolean("true") returns false
,应该使用Boolean.valueOf("true")
这个API。
结论
解决方案很简单:
MapUtils.getBoolean(queryTo, "cacheApi");
切莫自以为是,须善用工具类。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142136.html