我做了这个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!");
}
}
}
答案 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]*");