Java Scanner 循环输入无法结束?试试这三个方法
2024-07-24 12:30:51
深入剖析:Java Scanner 循环输入的那些“坑”
对于刚接触 Java 的新手来说,java.util.Scanner
类就像一把万能钥匙,帮助他们轻松地从控制台获取用户输入。然而,这把钥匙偶尔也会卡住锁芯,让初学者们摸不着头脑。其中最常见的问题之一就是:程序无法正常结束,即使输入结束后依然“痴痴地”等待着新的输入。
问题的根源在于 java.util.Scanner
默认会持续监听来自 System.in
(标准输入流) 的数据。当你敲下回车键,以为大功告成的时候,Scanner
却仅仅是接收到了一个换行符。对于 nextInt()
, nextDouble()
这类方法来说,换行符只是个“无关紧要”的分隔符,而不是输入结束的号令枪。因此,Scanner
会继续“坚守岗位”,等待下一个非空白字符的到来,导致程序陷入无休止的等待。
那么,如何才能让 Scanner
乖乖地结束输入,不再“无理取闹”呢?
方法一:nextLine() - 一网打尽
nextLine()
方法就像一个“强迫症患者”,它会读取整行输入,包括换行符,并将它们打包成一个字符串返回。我们可以利用 nextLine()
的“强迫症”特性,先读取整行输入,然后再使用 Integer.parseInt()
或 Double.parseDouble()
等方法将字符串“翻译”成我们需要的数值类型。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入学生人数:");
int numStudents = Integer.parseInt(scanner.nextLine());
String[] names = new String[numStudents];
for (int i = 0; i < numStudents; i++) {
System.out.print("请输入第 " + (i + 1) + " 个学生姓名:");
names[i] = scanner.nextLine();
}
System.out.println("学生姓名列表:");
for (String name : names) {
System.out.println(name);
}
}
}
方法二:close() - 功成身退
俗话说“君子善始善终”,对于 Scanner
对象来说也是如此。在使用完 Scanner
对象后,我们可以调用其 close()
方法,如同一位功成名就的将军,体面地退出历史舞台。关闭输入流可以确保程序在完成使命后优雅地结束。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = scanner.nextInt();
System.out.println("你输入的整数是:" + num);
scanner.close(); // 关闭 Scanner 对象
}
}
方法三:特定字符 - 约定暗号
除了使用 nextLine()
和 close()
之外,我们还可以预先设定一个“暗号”,例如 “-1” 或 “exit”,作为输入结束的信号。在循环中,我们只需判断用户输入是否等于这个“暗号”,如果是,则意味着任务完成,可以结束循环了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int sum = 0;
System.out.println("请输入数字 (输入 -1 结束):");
while (scanner.hasNextInt()) {
int num = scanner.nextInt();
if (num == -1) {
break; // 检测到暗号,跳出循环
}
sum += num;
}
System.out.println("数字总和为:" + sum);
}
}
总结
java.util.Scanner
无法结束输入就像一个顽皮的捣蛋鬼,但只要我们了解了他的“脾气”,就能轻松地制服他。选择适合程序逻辑的方法,可以让你的 Java 程序在与用户交互后,平稳地落下帷幕。
常见问题解答
-
为什么使用
nextInt()
后程序无法结束?因为
nextInt()
只读取整数,不会读取换行符。当用户按下回车键时,换行符会留在输入流中,导致Scanner
继续等待下一个输入。 -
nextLine()
和nextInt()
可以混合使用吗?混合使用时需要注意,
nextInt()
不会读取换行符,而nextLine()
会读取换行符。如果在nextInt()
之后直接使用nextLine()
,nextLine()
会读取nextInt()
留下的换行符,导致输入错误。 -
关闭
Scanner
对象会有什么影响?关闭
Scanner
对象会同时关闭其关联的输入流 (System.in
),这会导致程序无法再从控制台获取任何输入。 -
使用特定字符结束输入有什么优缺点?
优点是简单直观,缺点是用户输入的字符不能与预先设定的“暗号”冲突。
-
还有其他方法可以解决 Scanner 无法结束输入的问题吗?
可以使用
BufferedReader
类读取输入,它提供了更灵活的控制方式。