问题
在阿里巴巴的 FASTJSON 中,在 get 对象时遇到这样一个问题:键存在,但获取对象后,对对象的操作报 空指针异常
。
解决
问题复现
代码段如下:
@GetMapping("/t8")
public void test8(){
JSONObject jsonObject = new JSONObject();
jsonObject.put("lang", "");
System.out.println("获取的String为:" + jsonObject.getString("lang"));
System.out.println("对获取的String对象进行操作:" + jsonObject.getString("lang").toString());
System.out.println("获取的JSONObject为:" + jsonObject.getJSONObject("lang"));
System.out.println("对获取的JSONObject对象进行操作:" + jsonObject.getJSONObject("lang").toJSONString());
}
控制台输出:
获取的String为:
对获取的String对象进行操作:
获取的JSONObject为:null
2023-11-19 23:06:17.414 ERROR 3056 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
问题原因
从输出中相信大家已经看出了问题所在:即在对 JSONObject 进行操作时,如果是 jsonObject.getString()
方法获取字符串,那么获取到的是空字符串而非 NULL;如果是 jsonObject.getJSONObject()
方法获取 JSONObject 对象,那么获取到的是 NULL,所以空指针异常也就很好理解了。
注意:如果我们获取一个不存在的键值,例如获取 jsonObject.getString("lan");
,那么获取到的也是 NULL
。
总结
在使用 FASTJSON 时,如果 JSONObject 的键值不存在,那么获取到的是一个 NULL
。在开发中需要避免因此导致的空指针异常。