
本文介绍如何使用 scanner 读取用户在单行中输入的多个整数(以逗号分隔),并高效存入 arraylist,避免 inputmismatchexception,同时完成排序与极值提取。
本文介绍如何使用 scanner 读取用户在单行中输入的多个整数(以逗号分隔),并高效存入 arraylist,避免 inputmismatchexception,同时完成排序与极值提取。
在 Java 编程中,初学者常误用 Scanner.nextInt() 逐个读取数字,导致无法处理“一行多值”的常见输入场景(如 12,2,1,5,10)。该方式不仅交互繁琐,还易因格式不匹配抛出 InputMismatchException。正确做法是先读取整行字符串,再按分隔符解析。
✅ 推荐实现:一行输入 → 分割 → 转整型 → 存入 ArrayList
import java.util.*;
public class SingleLineInputExample {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
List<Integer> numbers = new ArrayList<>();
System.out.print("请输入整数(用逗号分隔,例如:3,15,7,22):");
String line = input.nextLine().trim(); // 读取整行并去除首尾空格
if (!line.isEmpty()) {
String[] parts = line.split(",\s*"); // 支持逗号后带任意空格(如 "1, 2, 3")
for (String part : parts) {
try {
int num = Integer.parseInt(part.trim());
numbers.add(num);
} catch (NumberFormatException e) {
System.err.println("警告:跳过无效输入 '" + part + "'(非整数)");
}
}
}
if (numbers.isEmpty()) {
System.out.println("未输入有效数字。");
return;
}
System.out.println("原始输入:" + numbers);
Collections.sort(numbers);
System.out.println("升序排列:" + numbers);
System.out.println("最小值:" + Collections.min(numbers));
System.out.println("最大值:" + Collections.max(numbers));
}
}? 关键要点说明
- input.nextLine() 替代 nextInt():避免因换行符残留导致后续读取异常,确保完整捕获用户输入。
- *正则分隔符 `",s"**:s*表示零个或多个空白字符(空格、制表符等),可兼容"1,2,3"、"4, 5, 6"` 等多种格式。
- trim() 防御性处理:消除每个数字前后的空格,防止 parseInt 因 " 7 " 报错。
- 异常捕获机制:对非法输入(如 "abc" 或空字符串)友好提示,不中断程序执行。
- 使用 List<Integer> 接口:比 ArrayList<Integer> 更符合面向接口编程规范,提升代码可维护性。
⚠️ 注意事项
- 不要混用 nextInt() 和 nextLine():nextInt() 不消耗换行符,紧随其后的 nextLine() 会立即返回空字符串——这是初学者最常见陷阱。
- 若需支持空格分隔(如 1 2 3 4),可改用 line.split("\s+");若需支持逗号/空格混合分隔,推荐使用 line.replaceAll("\s*,\s*", ",").split(",") 预处理。
- 对于大规模数据或生产环境,建议封装为工具方法,并增加输入校验(如范围限制、去重逻辑等)。
掌握这种“字符串→分割→转换→集合”的模式,是处理标准输入的基础能力,也适用于 CSV 解析、配置解析等实际场景。


















