初学者麻烦做...循环

时间:2013-09-13 03:46:33

标签: java console while-loop do-while

我对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'变量在第二次迭代时被自动赋值为?

2 个答案:

答案 0 :(得分:1)

要从控制台读取字符/字符串,您可以执行以下操作(取自here):

try{
        BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferRead.readLine();

        System.out.println(s);
    }

此外,该字符串无法与==!=运算符进行比较;使用字符串的equalsequalsIgnoreCase

请参阅此处http://www.tutorialspoint.com/java/java_string_equalsignorecase.htm

答案 1 :(得分:0)

那是因为你做的时候

confirmName = keyInput.findWithinHorizon(".",0).charAt(0);

您正在使用模式(.)告诉扫描仪找到下一个字符。但是,一旦用户输入响应,就会有多个字符(即'n'和换行符)。但是findWithinHorizo​​n并没有拿到那个换行符,所以当它回来时

bugOne.setName(keyInput.nextLine());

它立即拾起留在那里的空新线。要解决此问题,您可以在调用findWithinHorizo​​n之后立即添加以下代码行:

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"));