You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:20:55