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

