1

我想知道为什么在被问及此方法中是否还有更多数字后键入“y”时,代码可以正常工作并离开循环,但是在键入“n”并按回车时,我需要键入“n”和再次点击返回或该过程只是挂起。

为什么?

字符串 'input' 是从 main 方法中的用户输入传递的,在本例中是“addition”。

private int add(String input)
    {
        int additionValue = 0;
        boolean keepGoing = true;
        if (input.matches("addition"))
        {

            while (keepGoing == true)
            {
                System.out.println("Next digit = (Type the digit)");
                additionValue = additionValue + scan.nextInt();
                System.out.println("Any more digits? Type y/n");
                if (scan.next().matches("Y|y"))
                {
                    keepGoing = true;
                }
                else if (scan.next().matches("N|n"))
                {
                    keepGoing = false;
                }
                else
                {
                    System.out.println("Great, you broke it.");
                    System.exit(1);
                }
            }
        }
    }

我已经设法通过使用使代码正常工作

System.out.println("Any more digits? Type y/n"); 
String yayOrNay = scan.next();
if (yayOrNay.length()==1 && yayOrNay.charAt(0)=='y')
                {
                    keepGoing = true;
                }

但这对我来说似乎有点太复杂了。

4

6 回答 6

4

scan.next()从输入流中拉出一个新角色。

因此,当您检查“n”并scan.next().matches("Y|y")执行时,它实际上是在为您的下一次比较跳过“n”。

解决方案是分配给scan.next()您可以使用的变量:

        while (keepGoing == true)
        {
            System.out.println("Next digit = (Type the digit)");
            additionValue = additionValue + scan.nextInt();
            System.out.println("Any more digits? Type y/n");
            String next = scan.next();
            if (next.matches("Y|y"))
            {
                keepGoing = true;
            }
            else if (next.matches("N|n"))
            {
                keepGoing = false;
            }
            else
            {
                System.out.println("Great, you broke it.");
                System.exit(1);
            }
        }
于 2013-10-17T17:28:17.803 回答
1

这是因为您调用 scan.next() 两次。您必须调用它一次,将生成的字符串放入一个变量中。

String input2 = scan.next();
if (input2.matches("Y|y"))
{
    keepGoing = true;
}
else if (input2.matches("N|n"))
{
    keepGoing = false;
}
于 2013-10-17T17:30:45.400 回答
1

您需要输入“n”两次,因为您会在每个 if 条件中扫描输入。因此,如果字母不是“y”,您的程序将在下一个 if 语句中等待用户输入。

你可以简单地做:

String yayOrNay = scan.next();
if (yayOrNay.matches("Y|y"))
{
    keepGoing = true;
}
else if (yayOrNay.matches("N|n"))
{
    keepGoing = false;
}
...
于 2013-10-17T17:30:48.430 回答
0

您的错误是调用 scan.next() 两次,这需要两个输入。

private int add(String input)
{
    int additionValue = 0;
    boolean keepGoing = true;
    if (input.matches("addition"))
    {

        while (keepGoing == true)
        {
            System.out.println("Next digit = (Type the digit)");
            additionValue = additionValue + scan.nextInt();
            System.out.println("Any more digits? Type y/n");
            String s = scan.next();
            if (s.matches("Y|y"))
            {
                keepGoing = true;
            }
            else if (s.matches("N|n"))
            {
                keepGoing = false;
            }
            else
            {
                System.out.println("Great, you broke it.");
                System.exit(1);
            }
        }
    }
}
于 2013-10-17T17:29:15.780 回答
0

请试试这个,

Scanner scan = new Scanner(System.in);
        int additionValue=0;
        while (true)
        {
            System.out.println("Any more digits? Type y/n");  
            if (scan.next().matches("Y|y"))
            {
                 System.out.println("Next digit = (Type the digit)");
                 additionValue = additionValue + scan.nextInt();
                 //System.out.println("Any more digits? Type y/n");
            }
            else 
            {
                System.out.println("Thanks");
               break;
            }
        }

我不确定这个逻辑是否适合你。'如果你愿意,你也可以处理'n''

输出

Any more digits? Type y/n
y
Next digit = (Type the digit)
5
Any more digits? Type y/n
n
Thanks
于 2013-10-17T17:43:48.463 回答
0
                if (scan.next().matches("Y|y"))
            {
                keepGoing = true;
            }
            else if (scan.next().matches("N|n"))

你调用 scan.next两次

第一次检查它是否为 Y,如果不是,则再次从输入中读取

所以

        somevar=scan.next()
        if (somevar.matches("Y|y"))
        {
            keepGoing = true;
        }
        else if (somevar.matches("N|n"))
        {
            keepGoing = false;
        }
        else ..
于 2013-10-17T17:29:05.930 回答