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

单元测试调用JSONObject.getNumber()抛出NoSuchMethodError问题排查

解决JSONObject.getNumber()报NoSuchMethodError的问题

这问题我之前也碰到过,核心原因其实是版本不兼容——你用的org.json 20190722版本里根本没有getNumber()方法!

为什么会出现这个错误?

  • org.json.JSONObject.getNumber(String)方法是在20200518版本才正式新增的,目的是统一获取Number类型的值,避免开发者必须根据字段类型调用getInt()、getLong()等特定方法。而你当前依赖的20190722版本发布于这个方法之前,自然找不到这个方法。
  • 至于为什么只有单元测试场景报错,大概率是依赖版本不一致:
    • 生产环境的依赖树中,可能有其他第三方依赖间接引入了更高版本的org.json,覆盖了你指定的20190722;
    • 单元测试环境的依赖没有被覆盖,严格使用了你声明的20190722版本,所以触发了错误。你可以用Maven命令检查单元测试时的依赖树:
      mvn dependency:tree -Dscope=test
      

可选解决方案

方案1:升级org.json版本

如果你想继续使用getNumber()方法,直接把pom.xml里的org.json版本升级到20200518或更高的稳定版本即可,比如:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20240303</version> <!-- 推荐使用最新稳定版 -->
</dependency>

方案2:使用现有版本的替代方法

保持当前20190722版本的话,就用你已经想到的getInt(),或者根据字段实际类型选择对应的方法:

Number logId;
// 如果logId是整数类型
logId = jsonObject.getInt("logId");
// 如果可能是长整数
logId = jsonObject.getLong("logId");
// 或者更通用的方式,先获取Object再强转
Object logIdObj = jsonObject.get("logId");
if (logIdObj instanceof Number) {
    logId = (Number) logIdObj;
} else {
    // 处理非Number类型的异常情况
    throw new IllegalArgumentException("logId is not a Number");
}

内容的提问来源于stack exchange,提问作者Kenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:08