为什么这个While循环循环两次?

时间:2016-10-09 22:20:00

标签: java while-loop iteration

我做了这个while循环,它应该满足不同形状的功能,在它完成该形状的功能之后,它会一直询问形状,直到用户键入“Exit”。到目前为止我只完成了三角形,所以我只需要一些填充函数来确保它正确循环。问题是,在我完成三角形之后,它会在请求输入之前打印菜单两次而不是仅打印一次。任何人都可以向我解释这个吗?

while(password){
    System.out.println();
    System.out.println("---Welcome to the Shape Machine---");
    System.out.println("Available Options:");
    System.out.println("Circles");
    System.out.println("Rectangles");
    System.out.println("Triangles");
    System.out.println("Exit");
    String option = keyboard.nextLine();

    if(option.equals("Exit")){
        System.out.println("Terminating the program. Have a nice day!");
        return; 
    } else if(option.equals("Triangles")){
        System.out.println("Triangles selected. Please enter the 3 sides:");
        int sideA = 0;
        int sideB = 0;
        int sideC = 0;
        do{
            sideA = keyboard.nextInt();
            sideB = keyboard.nextInt();
            sideC = keyboard.nextInt();

            if(sideA<0 || sideB<0 || sideC<0)
                System.out.println("#ERROR Negative input. Please input the 3 sides again.");
        } while(sideA<0 || sideB<0 || sideC<0);

        if((sideA+sideB)<=sideC || (sideB+sideC)<=sideA || (sideA+sideC)<=sideB){
            System.out.println("#ERROR Triangle is not valid. Returning to menu.");
            continue;
        } else {
            System.out.println("good job!");
        }
    }
}

3 个答案:

答案 0 :(得分:0)

可能是您正在使用keyboard.nextLine();。在while循环之外的代码中,请确保始终使用.nextLine()而不是其他任何内容。

推理:如果你使用.next(),它只会消耗一个字,所以下次你调用.nextLine()时,它会消耗该行的结尾。

答案 1 :(得分:0)

在您说sideC = keyboard.nextInt()后,您输入的回车符(在输入数字后)仍在输入缓冲区中。然后打印菜单并执行String option = keyboard.nextLine();该命令读取并包括它找到的第一个换行符,这是仍在缓冲区中的换行符。 所以option现在是一个裸的换行符,它与“退出”或“三角形”不匹配,所以它再次循环并再次打印菜单。

答案 2 :(得分:0)

此问题是由输入缓冲区中的空格,回车符,换行符,换页符等遗留字符引起的。

由于下一个 keyboard.nextLine()与任何给定选项都没有匹配(并且因为没有&#34;否则&#34;在while循环的底部处理在这种情况下),控件进入下一次迭代,再次打印选项。根据周围的输入处理环境,有几个很好的答案可以解决这个问题。

由于您的意图是跳过所有空格,回车符,换行符,换页符,直到您再次获得有效字符串(选项),以下代码最适合您的情况

System.out.println();
System.out.println("---Welcome to the Shape Machine---");
//...
System.out.println("Exit");
String option = keyboard.nextLine();
keyboard.skip("[\\s]*");