[alibaba/fastjson]toJSONString()一定会抛异常!

2024-09-20 378 views
7

toJSONString() 这是JSON.java中的public String toJSONString(),该方法语句在jdk1.8下执行顺序如图 第三步关闭了out,但第四步又用到out.toString(),所以一定会抛出空指针异常!

回答

5

Are you sure?

0

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.

1

这个问题新版本修复了,我的项目用的老版本,害死我了.... 不过为什么github上src/JSON.java显示的代码不是最新的2.7.1的代码?

1

这代码没问题啊,你可以查下finally和return的执行顺序

2

try中有return的话,执行顺序: 执行到try中的return语句后,跳到finally执行。 你可以打断点试下哈,或者看下这个: https://blog.csdn.net/yongh701/article/details/50057975

这代码没问题啊,你可以查下finally和return的执行顺序

1

那篇博客有这句:“finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的“ 所以out.toString()先运算,然后执行finally,最后return运算结果

4

我看到最新版本的代码也没有改动。。

2

那篇博客有这句:“finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的“ 所以out.toString()先运算,然后执行finally,最后return运算结果

你说的对,函数返回结果的确是正确的,但是每次调用它都抛出了空指针异常。我打断点进去看是第四步: 我想知道为什么会这样子? image

1

这个不清楚,我用1.2.7版本没有出现这问题

8

这个问题怎么复现?

9

这个问题怎么复现?

使用com.alibaba.fastjson:1.2.46的jar包 写个测试方法: JSONObject obj = new JSONObject(); obj.put("key1","value1"); obj.toJSONString();

1

额,我这边没问题。。 image image image

6

额,我这边没问题。。 image image image

运行确实是没问题,当你以debug模式启动,进入toJSONString()方法,可以看到它抛出了异常。 我就是在debug代码的时候发现总有空指针异常的

6

debug确实会,不过不影响结果,而且我对比了下代码,没有改动,很奇怪。

2

好奇试了下,我这1.2.73也会报错啊。 猜测 应该是idea debug预览值造成的,调用out.close()之后,idea为了预览值再次调用了out.toString(),所以会报错。我用的idea 2020.1.4,idea新版本可能会修复这个问题吧。

2

额,我这边没问题。。 image image image

运行确实是没问题,当你以debug模式启动,进入toJSONString()方法,可以看到它抛出了异常。 我就是在debug代码的时候发现总有空指针异常的

你是idea的debug是吧,idea的debug会调用对象的toString方法,所以会报错的,你可以选择关掉idea的debug调用toString方法

1

好奇试了下,我这1.2.73也会报错啊。 猜测 应该是idea debug预览值造成的,调用out.close()之后,idea为了预览值再次调用了out.toString(),所以会报错。我用的idea 2020.1.4,idea新版本可能会修复这个问题吧。

不用猜测,大胆说,就是idea的问题,他debug时候就是会调用对象的toString方法的 图片

2

好奇试了下,我这1.2.73也会报错啊。 猜测 应该是idea debug预览值造成的,调用out.close()之后,idea为了预览值再次调用了out.toString(),所以会报错。我用的idea 2020.1.4,idea新版本可能会修复这个问题吧。

不用猜测,大胆说,就是idea的问题,他debug时候就是会调用对象的toString方法的 图片

终于明白了,感谢大佬们!