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

如何解决java.lang.numberformatexception: invalid double: ""异常?

解决java.lang.NumberFormatException: invalid double: ""异常

嗨,这个问题我碰到过好多次,咱们一步步来拆解解决~

首先这个异常的原因非常明确:你的JSON数据里,有一个本该是double类型的字段,但它的值是空字符串(""),而你的JsonConverter在解析时尝试把空字符串转成double,自然就触发报错了。

第一步:定位问题字段

先搞清楚到底是哪个字段出问题。你可以在processFinish方法开头加一行日志,把接口返回的完整JSON打印出来:

@Override 
public void processFinish(String s) {
    // 先打印JSON内容,方便排查
    Log.d("ProductJSON", s);
    productList = new JsonConverter<Products>().toArrayList(s, Products.class);
    // 后面的代码...
}

查看日志里的JSON结构,找到类似"某个字段": ""的条目——这个字段就是元凶,它在你的Products类里应该是被定义成double类型的。

第二步:选择合适的解决方案

根据你的业务场景,选下面的一种方式处理:

方案1:从源头修复(推荐)

如果业务逻辑上这个字段不应该是空字符串,那直接从根源解决:

  • 数据库端:给对应字段设置默认值(比如0),禁止存入空字符串;
  • 接口端:如果数据库返回null或空字符串,接口提前处理成0或者null再返回给客户端。

方案2:修改实体类的字段处理

如果确实无法避免空字符串返回,那把Products类里对应字段改成String类型,使用时再做安全转换:

// Products类里修改字段类型
public class Products {
    // 把原来的double类型改成String
    private String price;

    // 提供一个安全转换的方法
    public double getPrice() {
        // 先判断是否为空或空白字符串
        if (price == null || price.trim().isEmpty()) {
            return 0.0; // 这里可以换成你需要的默认值
        }
        // 捕获转换异常,避免崩溃
        try {
            return Double.parseDouble(price);
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return 0.0; // 异常时的默认值
        }
    }
}

方案3:自定义JSON解析规则

如果你的JsonConverter底层用的是Gson这类支持自定义解析的库,可以给double类型字段写一个适配器,自动处理空字符串:

// 自定义Double类型的解析适配器
public class SafeDoubleAdapter extends TypeAdapter<Double> {
    @Override
    public void write(JsonWriter out, Double value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        out.value(value);
    }

    @Override
    public Double read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return 0.0;
        }
        String valueStr = in.nextString();
        if (valueStr.trim().isEmpty()) {
            return 0.0;
        }
        try {
            return Double.parseDouble(valueStr);
        } catch (NumberFormatException e) {
            return 0.0;
        }
    }
}

// 然后创建Gson实例时注册这个适配器
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Double.class, new SafeDoubleAdapter())
        .create();
// 替换你原来的JsonConverter使用的Gson实例,或者直接用这个gson来解析
productList = gson.fromJson(s, new TypeToken<List<Products>>(){}.getType());

最后小提醒

优先选方案1,从源头解决能避免后续很多类似的异常;如果没办法改源头,再用方案2或3做客户端兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:02:36