你的位置:首页 > Java教程

[Java教程]类型转换及返回json对象的问题


	@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 . 以及 提示手机号未注册 。