我对Java非常陌生,但对VB.NET有一点“经验”,这是更宽容的。所以请原谅可能是一个愚蠢的问题,并原谅我糟糕的java词汇。 以下是控制台应用程序的片段:
do
{
out.println("Please enter the name of your space bug and press <enter> to continue");
out.println();
bugOne.setName(keyInput.nextLine());
out.println("You have entered '" + bugOne.getName() + "'.");
out.println("Is this correct? (y/n)");
confirmName = keyInput.findWithinHorizon(".",0).charAt(0);
}
while(confirmName != 'y' && confirmName != 'Y');
在第一次迭代时,它很好,输入的名称显示出来。然后它移动到确认,如果我键入'y'或'Y'它会下降到下一行代码中(正如您所期望的那样)。
但是,如果我键入其他任何内容,当它进行第二次迭代时,它不会暂停键盘输入。在我输入confirmName请求后,控制台窗口中生成的行立即读取
You have entered "".
Is this correct(y/n)?
为什么键盘输入暂停? (在VB控制台应用程序中,您必须指定何时暂停用户输入但是从我在Java中看到的您不能或不能...或者您可以吗?)
为什么通过访问器方法setName设置的'name'变量在第二次迭代时被自动赋值为?
答案 0 :(得分:1)
要从控制台读取字符/字符串,您可以执行以下操作(取自here):
try{
BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
String s = bufferRead.readLine();
System.out.println(s);
}
此外,该字符串无法与==
和!=
运算符进行比较;使用字符串的equals
或equalsIgnoreCase
。
请参阅此处http://www.tutorialspoint.com/java/java_string_equalsignorecase.htm
答案 1 :(得分:0)
那是因为你做的时候
confirmName = keyInput.findWithinHorizon(".",0).charAt(0);
您正在使用模式(.
)告诉扫描仪找到下一个字符。但是,一旦用户输入响应,就会有多个字符(即'n'和换行符)。但是findWithinHorizon并没有拿到那个换行符,所以当它回来时
bugOne.setName(keyInput.nextLine());
它立即拾起留在那里的空新线。要解决此问题,您可以在调用findWithinHorizon之后立即添加以下代码行:
keyInput.nextLine();
所以它看起来像这样:
confirmName = keyInput.findWithinHorizon(".",0).charAt(0);
keyInput.nextLine();
但实际上,做这样的事情有什么害处?忘记模式匹配,只需将其作为字符串读取。
String confirmName;
do
{
out.println("Please enter the name of your space bug and press <enter> to continue");
out.println();
bugOne.setName(keyInput.nextLine());
out.println("You have entered '" + bugOne.getName() + "'.");
out.println("Is this correct? (y/n)");
confirmName = keyInput.nextLine();
}
while(!confirmName.equalsIgnoreCase("y"));