• 隐式的前置依赖


    谜题

    下面代码有问题吗 ?

    Map<String, Object> extraMap;  // 声明
    
    Boolean isItemIncluded = isItemIncludingTax(extraMap.toString());
    
    private Boolean isItemIncludingTax(String extra) {
         JSONObject itemExtra = JSONObject.parseObject(extra);
         return itemExtra.containsKey("tax") && "1".equals(itemExtra.get("tax"));
    }
    

    写个简单的单测验证下:

    public class MapStringParserTest {
    
      @Test
      public void testParse() {
        Map<String, Object> map = new HashMap<>();
        map.put("a", "{"outer":1}");
        System.out.println(map);
    
        JSONObject parsed = JSONObject.parseObject(map.toString());
        System.out.println(parsed.getString("a"));
      }
    }
    

    输出结果:

    {a={"outer":1}}
    
    com.alibaba.fastjson.JSONException: expect ':' at 0, actual =
    
    	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:290)
    

    抛异常了。

    可是,奇怪的是程序运行正常 。  为什么 ? 猜猜看。



    谜底

    因为有前置依赖。

    
        orderItemFormatBO.setExtraMap(getExtraMap(extra));
    
        protected Map getExtraMap(String extraJson){
            if(StringUtils.isNoneEmpty(extraJson)){
                try {
                    return JSON.parseObject(extraJson);
                }catch (Exception e){
                    logger.error("extra fomat not valid:{}", extraJson, e);
                }
            }
            return null;
        }
    

    在设置的时候, extraMap 被设置为 JSONObject 对象, 而在调用 toString 的时候,根据多态,调用的是  JSONObject 的多态方法。 这才没出问题。

       public String toString() {
          return this.toJSONString();
       }
    

    好个超距呼应 ! 一旦 extraMap 被重新设置为新的 非 JSONObject 的 Map,就一定会出问题。

    别侥幸,虽然逃过一劫, 下次,还能幸运避免吗 ?

  • 相关阅读:
    Java多线程总结
    Linux命令总结
    Java笔记
    JDK7和JDK8一些重要新特性
    第八周(11.04-11.10)----每周报告
    第八周(11.04-11.10)----结对项目----逆波兰
    第八周(11.04-11.10)----个人作业----历年学生作品点评
    第七周PSP(10.27-11.03)
    第七周(10.27-11.03)----补交第六周(10.20-26)每周例行报告
    个人项目----词频统计WEB(部分功能)
  • 原文地址:https://www.cnblogs.com/lovesqcc/p/12088646.html
Copyright © 2020-2023  润新知