解决Java中NumberFormatException: For input string: "null"异常
修正NumberFormatException问题:处理字符串"null"而非null对象
我一眼就看出问题所在了——你的代码只处理了null对象引用,但从数据库获取大量数据时,很多时候空值会被封装成字符串"null"(不是null引用),这时候你的判断逻辑会漏掉这种情况,直接进入除法转换的分支,自然就抛出NumberFormatException了。
问题根源
你写的strMMR == null和strMultiplier == null只能识别变量是否为null对象,但数据库返回的空值可能是字符串"null"(比如某些ORM框架、数据导出工具的默认处理)。这种情况下strMMR不是null,而是值为"null"的String,调用Double.valueOf(strMMR)时就会触发解析异常。
修正后的代码
我给你调整了逻辑,同时覆盖null对象和值为"null"的字符串,还加了额外的数字有效性校验,避免其他意外情况:
import java.util.ArrayList; import java.util.List; public class MMRCalculator { List<String> MMRafterDivision = new ArrayList<>(); List<String> ReplaceNull = new ArrayList<>(); List<String> MMRDivisionMultiplier = new ArrayList<>(); public void MMRandMultiplier() { // 测试数据:加入数据库常见的"null"字符串场景 MMRafterDivision.add(null); MMRafterDivision.add("700"); MMRafterDivision.add("900"); MMRafterDivision.add("null"); ReplaceNull.add("1"); ReplaceNull.add(null); ReplaceNull.add("null"); ReplaceNull.add("2"); for (int i = 0; i < ReplaceNull.size(); i++) { String strMMR = MMRafterDivision.get(i); String strMultiplier = ReplaceNull.get(i); // 统一判断无效值:null对象、"null"字符串、空白字符串 boolean isMMRInvalid = isInvalidValue(strMMR); boolean isMultiplierInvalid = isInvalidValue(strMultiplier); if (isMMRInvalid && isMultiplierInvalid) { MMRDivisionMultiplier.add("null"); } else if (isMMRInvalid && !isMultiplierInvalid) { MMRDivisionMultiplier.add("null"); } else if (!isMMRInvalid && isMultiplierInvalid) { MMRDivisionMultiplier.add(strMMR); } else { // 安全转换数字,同时处理除以0的情况 try { double mmr = Double.parseDouble(strMMR); double multiplier = Double.parseDouble(strMultiplier); if (multiplier == 0) { MMRDivisionMultiplier.add("null"); } else { String result = String.valueOf(mmr / multiplier); MMRDivisionMultiplier.add(result); } } catch (NumberFormatException e) { // 处理其他非法数字格式(比如"abc"这类非数字字符串) MMRDivisionMultiplier.add("null"); e.printStackTrace(); // 可选:换成日志记录更友好 } } } System.out.println("MMR&MUL:" + MMRDivisionMultiplier); } // 辅助方法:统一判断各种无效输入 private boolean isInvalidValue(String str) { return str == null || str.trim().equalsIgnoreCase("null") || str.trim().isEmpty(); } public static void main(String[] args) { new MMRCalculator().MMRandMultiplier(); } }
关键改动说明
- 新增
isInvalidValue辅助方法,一次性覆盖null对象、大小写的"null"字符串、空白/空字符串,避免重复写判断逻辑。 - 加入
try-catch捕获NumberFormatException,处理类似"abc"这种非数字字符串的情况。 - 新增除以0的判断,防止触发
ArithmeticException,让代码更健壮。 - 补充了数据库常见的"null"字符串测试用例,确保修改后的逻辑能覆盖真实场景。
这样调整后,无论是null对象还是字符串"null",都会被正确识别为无效值,不会进入数字转换分支,自然就不会再抛出那个异常了。
内容的提问来源于stack exchange,提问作者Lavish Khetan
相关产品推荐
相关产品推荐

