Java ClassCastException求助:JSONObject$Null无法转为String异常
问题排查与解决:java.lang.ClassCastException: org.json.JSONObject$Null cannot be cast to java.lang.String
我仔细分析了你的错误日志和代码,这个异常的根源非常明确:当你使用org.json.JSONObject的get()方法获取字段值时,如果目标字段是null,它返回的不是Java原生的null,而是org.json.JSONObject$Null这个内部类的实例,直接将其强转为String就会触发类型转换异常。
从返回的JSON日志"errorCode":null就能看出问题,而你在代码第2274行写了String res = (String)jsonObj.get("errorCode");,这就是报错的直接原因。
解决方案
这里有两种可靠的解决方式,你可以根据需求选择:
1. 使用getString()方法替代强转
org.json.JSONObject提供了专门的getString()方法,它会自动处理null值,返回Java原生的null而非JSONObject$Null实例,完美解决类型转换问题:
// 替换原来的强转代码 String res = jsonObj.getString("errorCode");
2. 手动判断并处理null情况
如果你坚持使用get()方法,可以先判断返回值是否为JSONObject.NULL,再进行转换:
Object errorCodeObj = jsonObj.get("errorCode"); String res = JSONObject.NULL.equals(errorCodeObj) ? null : (String) errorCodeObj;
额外的代码优化建议
除了这个异常,你的代码还有几个潜在问题,我顺便提一下:
response参数重复定义:方法签名里写了HttpServletRequest request,HttpServletRequest response,第二个参数应该是HttpServletResponse response,这是明显的笔误。response字段处理错误:你当前用String res11 = (String)jsonObj.get("response");获取响应对象,但返回的response是JSON对象而非字符串,同样会触发类型转换异常。正确做法是用getJSONObject()获取:JSONObject responseObj = jsonObj.getJSONObject("response"); PatentLoginInfo patentLoginInfo = mapper.readValue(responseObj.toString(), PatentLoginInfo.class);- 多余的
RestTemplate调用:你已经通过HttpURLConnection获取了登录接口的响应,没必要再用restTemplate.getForObject(uri, String.class)重复请求,这既浪费资源又可能导致逻辑错误。 - 条件判断逻辑颠倒:代码中如果
res.equals("BVE000403")就跳转到index页面并提示"Password is invalid",但注释写的是"success",逻辑明显搞反了,需要修正判断和页面跳转逻辑。
内容的提问来源于stack exchange,提问作者user3578232
相关产品推荐
相关产品推荐

