昨天刚开始学Java,今天学的是input-taking。我知道为什么我们需要在使用
.nextLine()
之后使用 .nextInt()
接受输入之前清除扫描仪缓冲区,但是我注意到一件事,如果我在从 .nextLine()
接受输入之前删除打印语句。我不得不使用 .nextLine()
两次而不是一次来删除缓冲区,否则它不会按预期工作。
我的初始代码是这样的:
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number :");
int num = sc.nextInt();
sc.nextLine();
System.out.println("Enter the string :");
String str = sc.nextLine();
System.out.println(num);
System.out.println(str);
所以,如果我在获取输入字符串并将其存储在变量
str
之前删除打印语句,它再次将值\n
传递给该变量,即使我之前使用.nextLine()
删除了缓冲区。
当前代码:
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number :");
int num = sc.nextInt();
sc.nextLine();
sc.nextLine();
String str = sc.nextLine();
System.out.println(num);
System.out.println(str);
理想情况下,打印语句不应该对扫描仪缓冲区有任何影响,对吧?那么,为什么要跳过它呢?
此外,由于我已经删除了缓冲区,那么为什么它再次将值
\n
传递给我的变量str
除非我两次删除缓冲区或在获取输入之前传递打印语句。
我尝试用谷歌搜索它,并尝试在 YouTube 和此处进行大量搜索,但没有一个解决方案真正讨论了我现在面临的这个问题。
这完全是一个解释错误,是在输入时犯的。
当你运行你的代码时,你可以在你最喜欢的 IDE 中运行它。你们中的一个人(您或 IDE)无意中添加了另一个 ' ' 根据光标在控制台上的位置字符到末尾。这会导致扫描仪将其读取为另一行。您也可以通过键盘上的箭头键(上、下、左、右)移动光标。
好的,但为什么
System.out.println();
解决了问题?
因为它会将您的光标移动到正确的位置。
使用不同的IDE,你会发现这个问题不会发生。
这不是打印语句或“缓冲区”的问题。
你看,
nextInt()
方法留下了一个换行符,即
悬在输入中。 nextLine()
方法选择了这个
作为输入,因此,您必须添加另一个 nextLine() 来捕获实际的字符串输入。Integer.parseInt(sc.nextLine())
获取 int 值并使用普通 sc.nextLine()
获取字符串输入。或者添加 nextLine() 来消耗这个额外的 在 nextLine() 之前获取实际输入。