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

如何从CSV文件解析负数值字符串?解决NumberFormatException异常

解决NumberFormatException的几个实用建议

先明确:Integer.parseInt()完全支持解析负整数,比如Integer.parseInt("-57")是合法操作,所以问题不在负号本身,给你几个排查和解决方向:

  • 清理纬度字符串的前后空格
    CSV文件里常出现字段带首尾空格的情况,比如纬度实际是" -57"或者"-25 ",这些空格会导致parseInt抛出异常。解决方法是解析前调用trim()去掉空白:

    if (Integer.parseInt(tokens[2].trim()) < 0) {
        cities.add(tokens[0]);
    }
    
  • 正确跳过表头行
    你用reader.skip(1)只跳过了一个字符,而非整行表头。如果表头是"城市,国家,纬度,经度"这类内容,skip(1)只会跳过第一个字符,剩下的表头内容会被当成数据行读取,必然解析失败。应该用readLine()直接丢弃整行表头:

    // 替换reader.skip(1);
    reader.readLine(); // 读取并跳过表头行
    
  • 检查是否存在非标准负号或特殊字符
    部分CSV可能用全角负号(-)或其他特殊符号代替ASCII负号(-),这种情况parseInt无法识别。可以先打印tokens[2]的原始内容,或者用正则替换非标准符号:

    String latStr = tokens[2].trim().replaceAll("[^0-9-]", "");
    if (Integer.parseInt(latStr) < 0) {
        cities.add(tokens[0]);
    }
    
  • 添加异常捕获定位问题行
    在循环里加try-catch块,打印出错的行内容,能快速定位问题所在:

    while (reader.ready()) {
        String line = reader.readLine();
        try {
            String[] tokens = line.split(delimiter);
            if (Integer.parseInt(tokens[2].trim()) < 0) {
                cities.add(tokens[0]);
            }
        } catch (NumberFormatException e) {
            System.err.println("解析失败的行:" + line);
            e.printStackTrace();
        }
    }
    

如果后续需要处理更复杂的CSV(比如带引号的字段、转义逗号),建议用成熟的CSV解析库(比如OpenCSV),比手动split更稳定,但上面的方法足够解决你当前的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:22:33