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
相关产品推荐
相关产品推荐

