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,代碼已經更新為:

這版無異常,返回結果也正確。
完整過程:
