如何解决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
相关产品推荐
相关产品推荐

