这是JSON.java中的public String toJSONString(),该方法语句在jdk1.8下执行顺序如图 第三步关闭了out,但第四步又用到out.toString(),所以一定会抛出空指针异常!
[alibaba/fastjson]toJSONString()一定会抛异常!
回答
Are you sure?
Are you sure?
Yes,1.2.46 version has this problem but the newest 1.2.73 fixed it. You can use breaking point to test.
这个问题新版本修复了,我的项目用的老版本,害死我了.... 不过为什么github上src/JSON.java显示的代码不是最新的2.7.1的代码?
这代码没问题啊,你可以查下finally和return的执行顺序
try中有return的话,执行顺序: 执行到try中的return语句后,跳到finally执行。 你可以打断点试下哈,或者看下这个: https://blog.csdn.net/yongh701/article/details/50057975
这代码没问题啊,你可以查下finally和return的执行顺序
那篇博客有这句:“finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的“ 所以out.toString()先运算,然后执行finally,最后return运算结果
我看到最新版本的代码也没有改动。。
那篇博客有这句:“finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的“ 所以out.toString()先运算,然后执行finally,最后return运算结果
你说的对,函数返回结果的确是正确的,但是每次调用它都抛出了空指针异常。我打断点进去看是第四步: 我想知道为什么会这样子?
这个不清楚,我用1.2.7版本没有出现这问题
这个问题怎么复现?
这个问题怎么复现?
使用com.alibaba.fastjson:1.2.46的jar包 写个测试方法: JSONObject obj = new JSONObject(); obj.put("key1","value1"); obj.toJSONString();
额,我这边没问题。。
额,我这边没问题。。
运行确实是没问题,当你以debug模式启动,进入toJSONString()方法,可以看到它抛出了异常。 我就是在debug代码的时候发现总有空指针异常的
debug确实会,不过不影响结果,而且我对比了下代码,没有改动,很奇怪。
好奇试了下,我这1.2.73也会报错啊。 猜测 应该是idea debug预览值造成的,调用out.close()之后,idea为了预览值再次调用了out.toString(),所以会报错。我用的idea 2020.1.4,idea新版本可能会修复这个问题吧。
额,我这边没问题。。
运行确实是没问题,当你以debug模式启动,进入toJSONString()方法,可以看到它抛出了异常。 我就是在debug代码的时候发现总有空指针异常的
你是idea的debug是吧,idea的debug会调用对象的toString方法,所以会报错的,你可以选择关掉idea的debug调用toString方法
好奇试了下,我这1.2.73也会报错啊。 猜测 应该是idea debug预览值造成的,调用out.close()之后,idea为了预览值再次调用了out.toString(),所以会报错。我用的idea 2020.1.4,idea新版本可能会修复这个问题吧。
不用猜测,大胆说,就是idea的问题,他debug时候就是会调用对象的toString方法的
好奇试了下,我这1.2.73也会报错啊。 猜测 应该是idea debug预览值造成的,调用out.close()之后,idea为了预览值再次调用了out.toString(),所以会报错。我用的idea 2020.1.4,idea新版本可能会修复这个问题吧。
不用猜测,大胆说,就是idea的问题,他debug时候就是会调用对象的toString方法的
终于明白了,感谢大佬们!