将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)); } } } }
问题原因
- 分隔符设置无效:
input.useDelimiter("//s")写法错误,正则匹配空白字符应该用"\\s";且nextLine()会忽略Scanner的分隔符,直接读取整行,导致分隔符设置完全不起作用。 - 字符串转整数输入非法:
input.nextLine()读取的是包含空格的整行内容(如"12 24 21 30"),Integer.parseInt()只能解析纯数字字符串,传入带空格的字符串必然抛出异常。 - 数组长度逻辑有隐患:每次循环重新创建
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
相关产品推荐
相关产品推荐

