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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:35:23