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

Android Studio中NumberFormatException崩溃问题求助

解决NumberFormatException及CartAdapter失效问题

从你的日志和代码来看,核心问题是字符串转整数时的格式异常,同时你的CartAdapter构造函数存在潜在的列表初始化问题,这可能导致数据丢失或方法失效。下面一步步解决:

1. 先修复构造函数的致命问题

看你的CartAdapter构造函数:

public CartAdapter(List<Order> listData, Context context) {
    this.listData = listData;
    this.context = context;
    listData=new ArrayList<>(); // 这行完全多余且容易混淆!
}

这行listData=new ArrayList<>()是给方法参数重新赋值,不会影响this.listData,但完全没必要,而且会让后续维护者困惑。更稳妥的做法是复制传入的列表(避免外部修改影响Adapter数据),或者直接持有引用:

public CartAdapter(List<Order> listData, Context context) {
    this.context = context;
    // 复制列表,防止外部修改导致Adapter数据异常
    this.listData = listData != null ? new ArrayList<>(listData) : new ArrayList<>();
}

同时,确保getItemCount处理空列表的情况:

@Override
public int getItemCount() {
    return listData.size();
}

2. 解决NumberFormatException:即使是"1"也崩溃?

日志显示输入字符串是"1"仍抛异常,大概率是字符串中包含不可见的空白字符(比如全角空格、制表符、换行),或者Order类的getPrice()/getQuantity()返回的字符串并非纯数字(比如带货币符号、单位)。

解决方案:清理字符串+异常处理

修改onBindViewHolder中的价格计算逻辑,先去除字符串前后空白,再添加异常捕获避免崩溃:

@Override
public void onBindViewHolder(@NonNull CartViewHolder holder, int position) {
    // 先获取订单对象,避免空指针
    Order order = listData.get(position);
    if (order == null) {
        // 空订单的默认显示
        holder.txt_cart_name.setText("Unknown Item");
        holder.txt_cart_price.setText("$0.00");
        holder.img_cart_count.setImageDrawable(null);
        return;
    }

    // 处理数量显示
    TextDrawable drawable = TextDrawable.builder()
            .buildRound(order.getQuantity().trim(), Color.RED);
    holder.img_cart_count.setImageDrawable(drawable);

    // 处理价格计算:先清理字符串,再安全解析
    Locale locale = new Locale("en","US");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);

    String priceStr = order.getPrice().trim();
    String quantityStr = order.getQuantity().trim();

    int price = 0;
    int quantity = 0;
    try {
        price = Integer.parseInt(priceStr);
        quantity = Integer.parseInt(quantityStr);
    } catch (NumberFormatException e) {
        // 打印错误日志,方便排查
        Log.e("CartAdapter", "Parse failed: price='" + priceStr + "', quantity='" + quantityStr + "'", e);
        // 解析失败时设置默认值,避免崩溃
        price = 0;
        quantity = 0;
    }

    int totalPrice = price * quantity;
    holder.txt_cart_price.setText(fmt.format(totalPrice));
    holder.txt_cart_name.setText(order.getProductName());
}

3. 检查Order类的核心方法

务必确认Order类的getPrice()和getQuantity()返回的是纯数字字符串:

  • 比如如果getPrice()返回的是"$1"或"1元",那parseInt必然失败,需要修改Order类,确保这两个方法返回仅包含数字的字符串。
  • 如果无法修改Order类,就在解析前先去除非数字字符,比如:
// 只保留字符串中的数字字符
priceStr = priceStr.replaceAll("[^0-9]", "");
quantityStr = quantityStr.replaceAll("[^0-9]", "");

4. 验证数据来源

最后,检查传入CartAdapter的listData是否正确填充:

  • 确保数据源中的每个Order对象的price和quantity字段都有有效值,不是null或空字符串。
  • 可以在构造函数中打印日志,确认列表大小和数据内容:
Log.d("CartAdapter", "Received " + listData.size() + " items");
for (Order o : listData) {
    Log.d("CartAdapter", "Item: " + o.getProductName() + ", price=" + o.getPrice() + ", quantity=" + o.getQuantity());
}

通过以上步骤,应该能解决崩溃和Adapter方法失效的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:58:03