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

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

  • 相关阅读:
    面向对象(6day)
    pycharm使用问题总结
    docker学习(一)ubuntu上安装docker
    docker指令
    docker简单使用
    使用Docker搭建多人使用GPU服务器
    ubuntu常用指令
    高斯滤波
    ubuntu创建个人账户
    第一次使用SSE指令集
  • 原文地址:https://www.cnblogs.com/lovesqcc/p/12088646.html
Copyright © 2011-2022 走看看