作为今天早上我在Uni的Java课程练习,我不得不写一个小程序来要求用户输入一些细节,然后打印回来。我已经完成了它的编写,但是我遇到了一个奇怪的问题。
请参阅以下代码:
import java.util.Scanner;
public class Scanner_Exercise
{
public static void main (String[] args)
{
Scanner keyboardIn = new Scanner(System.in);
int accountId;
String accountName;
float accountBalance;
System.out.println("Account ID: "); //Line 13
accountId = keyboardIn.nextInt(); //Line 14
System.out.println("Account name: "); //Line 16
accountName = keyboardIn.nextLine(); //Line 17
System.out.println("Account balance: ");
accountBalance = keyboardIn.nextFloat();
}
}
当该程序运行时,跳过第17行(参考注释);打印Account name:
,但用户没有机会输入信息,就好像该行代码被注释掉了一样。没有错误被抛出。输出如下:
帐户ID:
2
帐户名称:
帐户余额:
但是,如果我用16和17切换第13行和第14行,如下所示,程序运行正常,不会跳过任何行。
System.out.println("Account name: "); //Line 16
accountName = keyboardIn.nextLine(); //Line 17
System.out.println("Account ID: "); //Line 13
accountId = keyboardIn.nextInt(); //Line 14
为什么在第一种情况下跳过第17行,而不是第二种?
如果它有某种相关性,我使用的是JDK 6 Update 18和TextPad 5.3.1。
答案 0 :(得分:5)
NextInt()
仅消耗整数值。一旦该方法确定输入的输入是一个完整的数字,它就会退出,而不会消耗按返回键所产生的字符。当你调用NextLine()
时,它会看到缓冲区中的返回字符并立即返回零长度字符串。
为了解决这个问题,我建议您始终使用NextLine()
。命令行用户非常习惯返回键是“输入值”键。使用NextLine()
将Integer.valueOf(result)
的结果解析为整数。
答案 1 :(得分:5)
查看javadoc应该会告诉您原因。
Scanner.nextLine()
跳到当前行的末尾,并返回它跳过的任何内容。由于用户已经输入了一些数据,因此该函数将返回输入流中剩余的内容。当您切换订单时,它还没有任何输入,这就是您要求输入的原因。
重要的部分:
此方法返回当前行的其余部分,不包括末尾的任何行分隔符。
答案 2 :(得分:1)
来自this thread:
它给你带来麻烦的原因是因为当用户输入一个整数然后点击回车时,刚刚输入了两件事:整数和一个“换行符”
\n
。
您正在调用的方法“nextInt
”只读取整数,这会在换行流中留下换行符。
但是,调用nextLine()
会在换行符中读取,这就是为什么在代码运行之前必须调用nextLine()
的原因。
您也可以调用next()
,也可以在换行符中读取。
答案 3 :(得分:0)
Scanner.nextInt捕获第一个整数而不是其他内容,因此它不处理新行字符,Scanner.readLine将其视为其输入。你可以在它们之间添加一个Scanner.next(),它会消耗新的行字符,但是这个解决方案有它自己的缺点。
我的解决方案是使用Scanner.readLine读取所有用户的输入,并从字符串中解析所需的结果。