zoukankan      html  css  js  c++  java
  • 记一次JSON.toJSONString()踩坑

    debug时发现toJSONString()总是抛出空指针异常,但能正常运行,结果也正确

    环境:JDK1.8
    com.alibaba.fastjson:1.2.46

    public static void main(String[] args) {
    		JSONObject obj = new JSONObject();
    		obj.put("key1","value1");
    		String jsonString = obj.toJSONString();
    		System.out.println("json字符串:"+jsonString);
    	}
    

    在JSON.toJSONString()方法上打断点,以debug模式启动

    看到执行到return out.toString抛出了NullPointerException,out对象中的buf已经为空:

    但toJSONString()的返回结果是正确的:

    再次debug发现:
    如果try{}中有return,那么执行到return那条语句时,会计算return后面的表达式,作为返回值存起来但不return。
    去执行finally{},再return,于是方法结束。

    在JSON.toJSONString()和SerializeWriter.toString()方法上打断点,debug启动:

    从这一步可以看出此时执行了return后面的表达式:out.toString()

    接下来进入finally块:

    这一步执行out.close(),out.close()源代码如下:

    它进行了一系列操作后,将buf设置为null。
    执行完finally块,程序又回到了return那一行,然后抛出了NullPointerException:

    总结一下,执行顺序是这样的:

    因为第3步将out对象的buf置为了null,但第4步时,idea在debug下有一个预览功能,会调用了out.toString(),这个方法又用到了buf.length,所以就抛出了NullPointerException。
    但又由于第2步已经将返回值暂存了起来,所以返回值是正常的。

    后来我又去下载fastjson最新版1.2.73,代码已经更新为:

    这版无异常,返回结果也正确。

    完整过程:

    https://github.com/alibaba/fastjson/issues/3622

  • 相关阅读:
    openfalcon源码分析之transfer
    openfalcon源码分析之hbs
    openfalcon源码分析之Judge
    kong插件官方文档翻译
    Lua 学习
    GO语言heap剖析及利用heap实现优先级队列
    GO语言list剖析
    算法之python创建链表实现cache
    杂项之rabbitmq
    杂项之python利用pycrypto实现RSA
  • 原文地址:https://www.cnblogs.com/red-vel/p/14307042.html
Copyright © 2011-2022 走看看