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

将List<String>转为int数组时出现NumberFormatException问题求助

NumberFormatException 问题解决

报错信息

Exception in thread "main" java.lang.NumberFormatException: For input string: "12 24 21 30"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

代码片段

初始代码部分

boolean ShouldContinue1 = true;
List<String> b = new LinkedList();
input.useDelimiter("//s");

while (ShouldContinue1) {
    String key = input.nextLine();
    b.add(key);

    int[] num = new int[(b.size()) / 2];
    int[] denom = new int[(b.size()) / 2];

    if (b_contains_string(key) == 1) {

问题循环部分

for (int i = 0; i < b.size() - 1; i++) {
            if (i % 2 == 0) {
                num[i / 2] = Integer.parseInt(b.get(i));
            } 
            else if (i % 2 != 0) {
                denom[i / 2] = Integer.parseInt(b.get(i));
            }
        }
    } 
    else {
        for (int i = 0; i < b.size(); i++) {
            if (i % 2 == 0) {

报错触发行

num[i / 2] = Integer.parseInt(b.get(i));

剩余代码部分

} 
            else if (i % 2 != 0) {
                denom[i / 2] = Integer.parseInt(b.get(i));
            }
        }
    }
}

问题原因

  1. 分隔符设置无效:input.useDelimiter("//s")写法错误,正则匹配空白字符应该用"\\s";且nextLine()会忽略Scanner的分隔符,直接读取整行,导致分隔符设置完全不起作用。
  2. 字符串转整数输入非法:input.nextLine()读取的是包含空格的整行内容(如"12 24 21 30"),Integer.parseInt()只能解析纯数字字符串,传入带空格的字符串必然抛出异常。
  3. 数组长度逻辑有隐患:每次循环重新创建num和denom数组会丢失之前的数据;当b.size()为奇数时,数组长度计算会少算一个元素,可能引发越界问题。

解决方法

方案1:改用next()读取单个数字

修正分隔符,用next()逐个读取纯数字字符串:

boolean ShouldContinue1 = true;
List<String> b = new LinkedList<>();
// 正确设置分隔符:匹配任意空白字符
input.useDelimiter("\\s+");

while (ShouldContinue1) {
    String key = input.next();
    // 可添加终止条件,比如输入"exit"停止循环
    if ("exit".equals(key)) {
        ShouldContinue1 = false;
        break;
    }
    b.add(key);

    int pairCount = b.size() / 2;
    int[] num = new int[pairCount];
    int[] denom = new int[pairCount];

    if (b_contains_string(key) == 1) {
        for (int i = 0; i < b.size() - 1; i++) {
            if (i % 2 == 0) {
                num[i / 2] = Integer.parseInt(b.get(i));
            } else {
                denom[i / 2] = Integer.parseInt(b.get(i));
            }
        }
    } else {
        for (int i = 0; i < b.size(); i++) {
            if (i % 2 == 0 && i/2 < num.length) {
                num[i / 2] = Integer.parseInt(b.get(i));
            } else if (i % 2 != 0 && i/2 < denom.length) {
                denom[i / 2] = Integer.parseInt(b.get(i));
            }
        }
    }
}

方案2:拆分整行字符串

若必须用nextLine(),先将整行按空格分割为单个数字字符串再处理:

boolean ShouldContinue1 = true;
List<String> b = new LinkedList<>();

while (ShouldContinue1) {
    String line = input.nextLine();
    // 按任意空白字符分割,跳过空字符串
    String[] parts = line.split("\\s+");
    for (String part : parts) {
        if (!part.isEmpty()) {
            b.add(part);
        }
    }

    int pairCount = b.size() / 2;
    int[] num = new int[pairCount];
    int[] denom = new int[pairCount];

    if (b_contains_string(b.get(b.size()-1)) == 1) {
        for (int i = 0; i < b.size() - 1; i++) {
            if (i % 2 == 0) {
                num[i / 2] = Integer.parseInt(b.get(i));
            } else {
                denom[i / 2] = Integer.parseInt(b.get(i));
            }
        }
    } else {
        for (int i = 0; i < b.size(); i++) {
            if (i % 2 == 0 && i/2 < num.length) {
                num[i / 2] = Integer.parseInt(b.get(i));
            } else if (i % 2 != 0 && i/2 < denom.length) {
                denom[i / 2] = Integer.parseInt(b.get(i));
            }
        }
    }
}

同时需确认b_contains_string方法的逻辑是否符合预期,确保能正确判断输入字符串的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:20:38