解决Integer.parseInt抛出NumberFormatException(输入字符串为null)的问题
问题根源
你遇到的NumberFormatException是因为product.getQuantity()返回的不是null对象,而是字符串"null"——你的判断if (product.getQuantity() != null)只能过滤掉null对象,没法识别值为"null"的字符串,所以调用Integer.parseInt()时会直接报错。另外还要注意,空串、空白字符串(比如" ")这类非法格式也会导致转换失败,最好一并处理。
解决方案
方案1:直接增强判断逻辑
在转换前,先检查字符串是否为"null"、空串或空白,再执行转换,同时加入异常捕获处理其他非法格式:
private void updateTotalQuantity() { int quantity = 0; double price = 0.0; Double totalPrice = 0.0; List<ProductDetail> products = mProductsAdapter.getProducts(); for (ProductDetail product : products) { String qtyStr = product.getQuantity(); // 过滤null对象、"null"字符串、空/空白串,再尝试转换 if (qtyStr != null && !qtyStr.trim().equalsIgnoreCase("null") && !qtyStr.trim().isEmpty()) { try { quantity += Integer.parseInt(qtyStr.trim()); } catch (NumberFormatException e) { // 遇到"abc"这类非法格式时,打日志或直接忽略 e.printStackTrace(); } } String priceStr = product.getPrice(); // 计算总价时同样增强判断逻辑 if (priceStr != null && !priceStr.trim().equalsIgnoreCase("null") && !priceStr.trim().isEmpty() && qtyStr != null && !qtyStr.trim().equalsIgnoreCase("null") && !qtyStr.trim().isEmpty()) { try { price = Double.parseDouble(priceStr.trim()); int qty = Integer.parseInt(qtyStr.trim()); totalPrice += price * qty; } catch (NumberFormatException e) { e.printStackTrace(); } } } totalQty.setText(String.valueOf(quantity)); totalOrder.setText(String.valueOf(totalPrice)); }
方案2:封装安全转换工具方法(推荐)
把字符串转数字的逻辑抽成工具方法,代码更简洁,还能在其他地方复用:
// 安全转换字符串为int,非法情况返回0 private int safeParseInt(String str) { if (str == null || str.trim().equalsIgnoreCase("null") || str.trim().isEmpty()) { return 0; } try { return Integer.parseInt(str.trim()); } catch (NumberFormatException e) { e.printStackTrace(); return 0; } } // 安全转换字符串为double,非法情况返回0.0 private double safeParseDouble(String str) { if (str == null || str.trim().equalsIgnoreCase("null") || str.trim().isEmpty()) { return 0.0; } try { return Double.parseDouble(str.trim()); } catch (NumberFormatException e) { e.printStackTrace(); return 0.0; } } // 简化后的updateTotalQuantity方法 private void updateTotalQuantity() { int quantity = 0; Double totalPrice = 0.0; List<ProductDetail> products = mProductsAdapter.getProducts(); for (ProductDetail product : products) { int qty = safeParseInt(product.getQuantity()); quantity += qty; double price = safeParseDouble(product.getPrice()); totalPrice += price * qty; } totalQty.setText(String.valueOf(quantity)); totalOrder.setText(String.valueOf(totalPrice)); }
额外建议
如果是接口返回的"null"字符串,最好和后端开发沟通,让他们返回null对象或者合法的数字字符串,从源头避免这类格式问题。
内容的提问来源于stack exchange,提问作者Moeez
相关产品推荐
相关产品推荐

