2010-03-10 80 views
6

今天早上作为我在Uni的Java课程练习,我不得不编写一个小程序来要求用户输入一些细节,然后再打印回来。我已经写完了,但是我一路上遇到了一个奇怪的问题。为什么这个Java程序的第17行没有被执行?

见下面的代码:

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:
帐户名:
账户余额:

然而,如果切换线13和14与16和17,等作为随后,程序运行正常,并且不会跳过任何行。

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行,但不是第2行?

如果它有某种相关性,我使用的是JDK 6 Update 18和TextPad 5.3.1。

回答

5

看看javadoc应该会告诉你为什么。

Scanner.nextLine()跳到当前行的末尾,并返回它跳过的内容。由于用户已经输入了一些数据,这个函数将返回输入流中剩下的东西。当您切换顺序时,它还没有任何输入,这就是为什么你看到它要求输入。

最重要的部分:

此方法返回的当前行的其余部分,不包括在端任何在线分离器。

+1

谢谢,这清除了它。我应该首先提到文档。 – Auguste 2010-03-10 07:33:41

+0

@Auguste你住,你学习!尝试做功课并提出一个合理的问题+1! – Kiril 2010-03-10 08:18:39

5

NextInt()仅消耗整数值。一旦该方法确定输入的输入是一个完整的数字,它就会退出,而不会消耗返回按键产生的字符。当您调用NextLine()时,它会在缓冲区中看到返回字符,并立即返回零长度的字符串。

为了解决这个问题,我建议你总是使用NextLine()。命令行用户非常习惯返回键是“输入值”键。使用Integer.valueOf(result)作为整数解析NextLine()的结果。

1

this thread

它给你带来麻烦,是因为当用户输入一个整数,然后命中进入的原因,两件事情刚刚进入:整数和“换行”,这是\n
您调用的方法“nextInt”仅读取整数,这会在输入流中留下换行符。
但拨打nextLine()确实在换行符中读取,这就是为什么在代码工作之前必须调用nextLine()
你也可以叫next(),它也可以在换行符中阅读。

0

Scanner.nextInt抓住了第一个整数发生,没有别的,所以它不处理换行符,这Scanner.readLine将看到它的输入。您可以在两者之间添加一个Scanner.next(),这将消耗新的行字符,但此解决方案有其自身的缺点。

我的解决方案是使用Scanner.readLine读取用户的所有输入,并从字符串中解析所需的结果。