scanner 应直接用字符串构造而非后续替换;读取整数前须用 hasnextint() 检查;逗号分隔需显式 setdelimiter() 并注意正则转义;推荐 try-with-resources 确保 close()。

Scanner 构造时传入字符串比调用 nextLine() 更可靠
直接用 new Scanner("12 34 56") 初始化,而不是先构造空 Scanner 再试图“喂”字符串进去——后者根本不可行。Scanner 的输入源在构造时就绑定,后续无法替换或追加。常见错误是写成 Scanner sc = new Scanner(System.in); sc = new Scanner("12 34 56");,这会丢失原 Scanner 实例,且逻辑混乱。
正确做法是:把目标字符串作为构造参数传入,之后所有 next* 方法都从该字符串中按分隔符(默认空白字符)提取 token。
用 nextInt() 连续读取整数前必须确认有输入
跳过检查直接调用 nextInt() 容易触发 NoSuchElementException 或 InputMismatchException。尤其当字符串末尾有空格、换行,或实际内容不全是数字时(比如混入字母),nextInt() 会失败而非跳过。
安全做法是配合 hasNextInt() 使用:
Scanner sc = new Scanner("12 abc 34 56");
while (sc.hasNext()) {
if (sc.hasNextInt()) {
System.out.println(sc.nextInt()); // 输出 12, 34, 56
} else {
sc.next(); // 跳过非整数 token,如 "abc"
}
}
分隔符不是空格时要显式设置 useDelimiter()
默认 Scanner 以空白符(空格、制表、换行等)为分隔符。如果字符串是逗号分隔的,例如 "12,34,56",不改分隔符会导致 nextInt() 报 InputMismatchException,因为整个 "12,34,56" 被当作一个 token,而它不符合整数格式。
需在构造后立即调用 useDelimiter():
-
sc.useDelimiter(",")—— 匹配字面逗号 -
sc.useDelimiter("[,\s]+")—— 同时支持逗号和任意空白(更鲁棒) - 注意:正则中的反斜杠必须双写,
"\s"才表示空白字符类
设置后,nextInt() 才能正确切出每个数字部分。
解析完记得 close(),但字符串源无资源泄漏风险
对基于字符串的 Scanner,调用 close() 是良好习惯,但不会释放任何系统资源(不像文件或流)。不过若代码未来可能切换到文件输入(如 new Scanner(new File("data.txt"))),统一加 close() 可避免遗漏导致的资源泄露。
更推荐用 try-with-resources 确保执行:
try (Scanner sc = new Scanner("12 34 56")) {
while (sc.hasNextInt()) {
System.out.println(sc.nextInt());
}
} // 自动 close
真正容易被忽略的是:正则分隔符写错(比如漏掉方括号或双反斜杠)、误把 next() 当作跳过整行用(它只跳一个 token)、以及没处理混合类型输入时的异常分支。这些地方一错,程序就停在半路。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











