@ResponseBody @RequestMapping(value="/user/getUserId.do")//method=RequestMethod.POST public JSONObject getUserId(HttpServletRequest request, HttpServletResponse response)throws Exception { response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); String phoneNum = request.getParameter("phoneNum"); JSONObject jsonObject = new JSONObject(); Integer userId = 0; try { userId = userSlaveService.getUserId(phoneNum); if(StringUtils.isNotEmpty(Integer.toString(userId))){ jsonObject.accumulate("userId", userId); } // else{ // return null; // } } catch (Exception e) { Loger.logtxt("user", "獲取Userid異常:" + e.toString()); } return jsonObject; }
1. Integer 型變量 a 轉換成 String 時, 如果 a 是 null ,用 Integer.toString(a) 或者 a.toString() 都會報空指針異常,需要 放到 try catch 中捕獲異常。
如上代碼,如果 根據手機號 沒有查到 Userid ,則 Userid 是 null 。 Integer.toString(userId) 會拋出 NullPointer 空指針異常,if 中的語句不會執行,跳到 catch , 執行catch 中的代碼。 返回的
jsonObject 是 {}
//獲取注冊用戶userid function getUserId(){ var phoneNum=$("#phoneNum").val() $.getJSON( '<%=basePath %>user/getUserId.do', {phoneNum:phoneNum}, function(data){ alert("data:" + data) alert("data.userid:" + eval(data).userId) if(!(eval(data).userId)){ alert('該手機號未注冊,請先注冊'); } else{ document.getElementById("marcherId").value=data.userId; } } ); }
前台 js 打印: data:[Object Object] 和 data.userid: undefined . 以及 提示手機號未注冊 。
如果 類型轉換 不放到 try catch 中 ,比如寫成如下:
@ResponseBody @RequestMapping(value="/user/getUserId.do")//method=RequestMethod.POST public JSONObject getUserId(HttpServletRequest request, HttpServletResponse response)throws Exception { response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); String phoneNum = request.getParameter("phoneNum"); JSONObject jsonObject = new JSONObject(); Integer userId = 0; try { userId = userSlaveService.getUserId(phoneNum); // if(StringUtils.isNotEmpty(Integer.toString(userId))){ // jsonObject.accumulate("userId", userId); // } } catch (Exception e) { Loger.logtxt("user", "獲取Userid異常:" + e.toString()); } if(StringUtils.isNotEmpty(Integer.toString(userId))){ jsonObject.accumulate("userId", userId); } else{ return null; } return jsonObject; }
在執行到 if 中的 Integer.toString(userId) 時,程序拋出異常。
後台報錯: java.lang.NullPointerException ,程序異常終止,並不會執行 return 和 else 語句。前台頁面沒有任何反應。
如果寫成這樣:
@ResponseBody @RequestMapping(value="/user/getUserId.do")//method=RequestMethod.POST public JSONObject getUserId(HttpServletRequest request, HttpServletResponse response)throws Exception { response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); String phoneNum = request.getParameter("phoneNum"); JSONObject jsonObject = new JSONObject(); Integer userId = 0; try { userId = userSlaveService.getUserId(phoneNum); // if(StringUtils.isNotEmpty(Integer.toString(userId))){ // jsonObject.accumulate("userId", userId); // } } catch (Exception e) { Loger.logtxt("user", "獲取Userid異常:" + e.toString()); } jsonObject.accumulate("userId", userId); return jsonObject; }
沒有查到數據,userId 是 null ,返回的 jsonObject 是 {"userId":null} 。 後台正常返回,沒有異常拋出。
在 Chrome 中看到的是 500 Internal Server Error ,jquery1.6.1.js 的 xhr.send( ( s.hasContent && s.data ) || null ); 出錯。 前台沒有任何反應,沒有執行 前台 的
function(data) 函數 。(why?)
對於前台的 /eduappweb/user/getUserId.do?phoneNum=56354635635 HTTP/1.1 消息, 後台返回 HTTP/1.1 500 Internal Server Error The server encountered an internal error that prevented it from fulfilling this request.
所以如果要給前台返回json對象,需要判斷json對象中key 的value 是不是 null 。如果json 中 value 的值是 null ,則返回 {} 給前台,不要把 {“key”:null} 這樣的形式返回給前台。
$.getJSON( '<%=basePath %>user/getUserId.do', {phoneNum:phoneNum}, function(data){ alert("data:" + data) alert("data.userid:" + eval(data).userId) if(!(eval(data).userId)){ alert('該手機號未注冊,請先注冊'); } else{ document.getElementById("marcherId").value=data.userId; } } );
如果後台返回 null ,會執行 fanction 函數, 打印 data:null 。但是 eval(data).userId 會報錯 Uncaught TypeError: Cannot read property 'userId' of null
如果後台寫成這樣:
JSONObject jsonObject = new JSONObject(); System.out.println("jsonObject: " + jsonObject); if(userId==null){ return jsonObject; }else{ jsonObject.accumulate("userId", userId); } return jsonObject;
返回的是 jsonObject 值是 {} , function函數正常執行。前台 js 打印: data:[Object Object] 和 data.userid: undefined . 以及 提示手機號未注冊 。