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

Java循环中valueOf函数报错NumberFormatException问题排查求助

解决valueOf转换失败的NumberFormatException问题

嘿,这个报错一看就明白啦!咱们先拆解下问题的核心:

问题根源

报错信息里明确写了For input string: "Temperature"——这说明你尝试把字符串"Temperature"转换成Double类型,但这个字符串根本不是数字格式,自然会抛出NumberFormatException。

为什么会拿到这个字符串?大概率是你的myData集合里包含了CSV的表头行(也就是列名那一行),当循环遍历到这一行时,cell[9]对应的就是"Temperature"这个列名,而非温度数值,转换操作直接就失败了。

另外你的三层循环逻辑也有明显问题:外层循环遍历1-12月、1-30天,然后每次都把所有myData重新遍历一遍,不仅效率极低,还会重复处理数据,放大了表头带来的问题。

解决方案

这里给你几个递进的解决思路:

1. 先跳过表头行

如果myData的第一个元素是表头,那遍历的时候直接跳过第一行就行。假设myData是List<String>类型,修改遍历方式:

int d = 0;
// 从索引1开始,跳过索引0的表头行
for (int idx = 1; idx < myData.size(); idx++) {
    String element = myData.get(idx);
    String[] cell = element.split(",");
    // 先确保数组长度足够,避免数组越界
    if (cell.length < 10) {
        System.err.println("数据格式错误,列数不足:" + element);
        continue;
    }
    try {
        double temp = Double.valueOf(cell[9]);
        int month = Integer.valueOf(cell[5]);
        int day = Integer.valueOf(cell[6]);
        if (temp < 0.0 && month == i && day == k) {
            d++;
        }
    } catch (NumberFormatException e) {
        System.err.println("跳过无法转换数值的行:" + element);
    }
}

2. 优化循环结构(大幅提升效率)

你的原循环会重复遍历myData12*30=360次,完全没必要!反过来只遍历一次myData,直接判断每条数据是否符合条件就行:

int d = 0;
// 跳过表头
for (int idx = 1; idx < myData.size(); idx++) {
    String element = myData.get(idx);
    String[] cell = element.split(",");
    if (cell.length < 10) {
        System.err.println("无效数据行:列数不足,跳过 -> " + element);
        continue;
    }
    try {
        double temp = Double.parseDouble(cell[9]);
        int month = Integer.parseInt(cell[5]);
        int day = Integer.parseInt(cell[6]);
        // 直接判断温度<0,且月份在1-12,日期在1-30
        if (temp < 0.0 && month >= 1 && month <= 12 && day >= 1 && day <= 30) {
            d++;
        }
    } catch (NumberFormatException e) {
        System.err.println("无法转换数值,跳过该行 -> " + element);
    }
}

这样只需要遍历一次数据,效率提升不止一个档次,还能避免重复处理。

3. 额外的安全防护

如果你的数据里除了表头,还有其他脏数据(比如空值、非数字字符串),用try-catch包裹转换操作是很有必要的,这样不会因为某一行数据错误导致整个程序崩溃。

额外提醒

  • 确认split(",")是否能正确分割数据:如果某些字段里包含逗号(比如带引号的字符串),直接用逗号分割会出错,这时候需要用专门的CSV解析库来处理更稳妥。
  • 每次拆分后先检查数组长度,避免出现ArrayIndexOutOfBoundsException(比如某行数据少了几列,cell[9]根本不存在)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:32:36