記一次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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM