zoukankan      html  css  js  c++  java
  • 隐式的前置依赖

    谜题

    下面代码有问题吗 ?

    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,就一定会出问题。

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

  • 相关阅读:
    实例15_C语言绘制万年历
    医生酒精
    实例13_求解二维数组的最大元素和最小元素
    用二维数组实现矩阵转置
    C语言中的typedef跟define的区别
    C语言设计ATM存取款界面
    MyBatis,动态传入表名,字段名的解决办法
    在mybatis执行SQL语句之前进行拦击处理
    使用Eclipse构建Maven的SpringMVC项目
    Debug过程中的mock (及display窗口的使用)
  • 原文地址:https://www.cnblogs.com/lovesqcc/p/12088646.html
Copyright © 2011-2022 走看看