【问题标题】:Code doesn't wait for user input?代码不等待用户输入?
【发布时间】:2012-06-12 21:04:11
【问题描述】:

我必须为我的计算机科学课做一个项目。问题是:

图书馆的读者最多可以借三本书。因此,赞助人有一个名字和最多三本书。一本书有作者和书名。设计和实现两个类,Patron 和 Book,来表示这些对象和以下行为:

  • 客户端可以用标题和作者实例化一本书
  • 客户可以检查但不能修改书名或作者
  • 客户可以询问顾客是否借过一本书(按书名标识)。
  • 客户可以告诉顾客归还给定书籍(由书名标识)。
  • 客户可以告诉顾客借一本书。

Patron 类应该为每本书使用一个单独的实例变量(总共三个)。 这些变量中的每一个最初都是空的。借书时,读者会查找不为空的变量。如果没有找到这样的变量,则该方法返回 false。如果找到空变量,则将其重置为新书并且该方法返回 true。类似的考虑适用于其他方法。使用方法 aString.equals(aString) 比较两个字符串是否相等。确保为您的类包含适当的 toString 方法并使用测试程序对其进行测试。

这是我的Client 类,其中包含main 方法:http://pastebin.com/JpxCT2F6

现在我的问题是,当我运行程序时,程序不会等待用户输入。以下是 Eclipse 控制台中出现的内容:

Please enter title of book 1: 
s
Please enter author of book 1: 
e
Please enter title of book 2: 
f
Please enter author of book 2:
t
Please enter title of book 3: 
g
Please enter author of book 3:
d
Which book would you like to check for?
s
The patron has taken out the book s
Would you like to return a book? (1 yes or 2 no)
1
Which book would you like to return?
Sorry, could not find the book 
Would you like to take out a book? (1 yes or 2 no)
2
Invalid option
Which book would you like to check for?
The patron does not have  taken out
Would you like to return a book? (1 yes or 2 no)

如您所见,控制台不会在“您想归还哪本书?”之后等待用户输入。相反,它需要一个空白值。后来在代码中,我输入了“2”,这意味着不返回任何书,而是给我一个无效的输入输出。

【问题讨论】:

  • 似乎 nextInt() 不吃换行符。
  • 我将从这里开始:Java Debugging with Eclipse Tutorial。使用它,您将能够放大代码并确定问题所在;那么如有必要,您可以提出更具体的问题。
  • 欢迎来到 *。请不要发布指向您的整个代码的链接,而是发布您需要帮助的代码片段(异常、编译错误等)。
  • 我复制粘贴了您的 pastebin 代码,创建了空的 PatronBook 类,它等待用户输入。当试图说“不”来退书时,它只给出“无效选项”

标签: java input console


【解决方案1】:

您可以使用nextInt(); 使输入停止并等待响应。

【讨论】:

  • 请不要对已经彻底正确回答过的老问题添加简短的答案!
【解决方案2】:

您只需转到下一行。 input.nextLine();

【讨论】:

    【解决方案3】:

    您在代码的第 71 行使用nextInt(),它会获得用户提供的整数答案。然后你使用nextLine() 哪个Advances this scanner past the current line and returns the input that was skipped.。跳过的输入只是前一个 nextInt() 调用中的换行符(它不会读取整行,只读取 int)。

    您可以通过在需要输入之前调用一次input.nextLine() 来跳过此操作,或者使用nextLine() 而不是nextInt() 并将字符串转换为整数值。

    【讨论】:

    • 我在调用input.nextInt() 后立即添加了input.nextLine(),它就像一个魅力。谢谢!
    【解决方案4】:

    nextLine 吃掉换行符。 nextInt 将其留在输入缓冲区中,并且下一个 readLine 立即终止。

    快速修复:对所有内容都使用 readLine,然后从读取的字符串中解析 int。

    【讨论】: