JAVA:创建菜单循环
我的程序包含一些选项,用户可以通过输入一个数字来选择这些选项,从而完成特定的任务。目前,我的代码是通过if和elseif循环设置的,以在输入一定数量时完成任务。但是,在一个任务完成后程序终止的那一分钟。我希望用户能够输入另一个数字来完成另一项任务。我曾尝试使用while循环和exit选项来包围代码,以允许用户退出循环并结束程序,但这不起作用,并导致“java.util.NoSuchElementException”。程序在没有while循环的情况下运行良好 这是当前代码的一个示例,希望能传达我的意思:JAVA:创建菜单循环,java,infinite-loop,nested-loops,Java,Infinite Loop,Nested Loops,我的程序包含一些选项,用户可以通过输入一个数字来选择这些选项,从而完成特定的任务。目前,我的代码是通过if和elseif循环设置的,以在输入一定数量时完成任务。但是,在一个任务完成后程序终止的那一分钟。我希望用户能够输入另一个数字来完成另一项任务。我曾尝试使用while循环和exit选项来包围代码,以允许用户退出循环并结束程序,但这不起作用,并导致“java.util.NoSuchElementException”。程序在没有while循环的情况下运行良好 这是当前代码的一个示例,希望能传达我的
System.out.println("Enter one of the following commands:");
System.out.println("1 - something..");
System.out.println("2 - something else..");
System.out.println("3 - exit");
Scanner scanchoice = new Scanner(System.in);
System.out.println();
System.out.println("Enter \"1\", \"2\" or \"3\"");
int choiceentry = scanchoice.nextInt();
while (choiceentry != 3) {
if (choiceentry < 1 || choiceentry > 3) {
System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
choiceentry = scanchoice.nextInt();
}
else if(choiceentry == 1) {
// ..do something
}
else if(choiceentry == 2) {
//..something else
}
else if(choiceentry == 3) {
//...exit program
}
}
System.out.println(“输入以下命令之一:”);
System.out.println(“1-某物”);
System.out.println(“2-其他东西”);
System.out.println(“3-退出”);
Scanner scanchoice=新扫描仪(System.in);
System.out.println();
System.out.println(“输入\“1\”、\“2\”或\“3\”);
int choiceentry=scanchoice.nextInt();
while(choiceentry!=3){
如果(choiceentry<1 | | choiceentry>3){
System.out.println(“输入\“1\”、\“2\”、\“3\”或\“4\”);
choiceentry=scanchoice.nextInt();
}
else if(choiceentry==1){
//做点什么
}
else if(choiceentry==2){
//…还有别的吗
}
else if(choiceentry==3){
//…退出程序
}
}
所以我想进入这个循环,只退出以终止程序。我希望while循环将用户带回菜单,允许您选择另一个选项,但是这不起作用。这个代码有什么问题?我怎样才能实现这个想法
提前谢谢 在调用Scanner.nextInt()
之前,请使用Scanner\hasNextInt()
以消除NoTouchElementException
if(scanchoice.hasNextInt())
choiceentry = scanchoice.nextInt();
hasNextInt()
仅当下一个标记是有效的int时才返回true
你可以这样做
//set choiceentry to -1, this will make it to enter while loop
int choiceentry = -1
while(choiceentry < 1 || choiceentry > 3){
System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
if(scanchoice.hasNextInt())
choiceentry = scanchoice.nextInt();
}
switch(choiceentry){
case 1:
//do logic
break;
case 2:
//do logic
break;
case 3:
//do logic
break;
}
//将choiceentry设置为-1,这将使其进入while循环
int choiceentry=-1
而(choiceentry<1 | | choiceentry>3){
System.out.println(“输入\“1\”、\“2\”、\“3\”或\“4\”);
if(scanchoice.hasNextInt())
choiceentry=scanchoice.nextInt();
}
开关(choiceentry){
案例1:
//做逻辑
打破
案例2:
//做逻辑
打破
案例3:
//做逻辑
打破
}
我把它改为使用switch语句,因为它们在获取输入数据时非常方便。如果选择是
<1
或>3
您必须在else
语句中设置此代码`:
while (choiceentry != 3) {
else if(choiceentry == 1) {
// ..do something
}
else if(choiceentry == 2) {
//..something else
}
else if(choiceentry == 3) {
//...exit program
}
else{
System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
choiceentry = scanchoice.nextInt();
}
}
如果您希望程序继续提示用户选择任务,则需要将该提示以及
nextInt()
调用移动到循环内部If语句外部的某个位置,以便在每次迭代时始终调用它
正如Phi先生在评论中所建议的那样,转换声明将是当前if-else结构的更好替代方案。它将使您的代码更易于阅读,并且默认情况下捕获意外值非常好
我还想补充一点,做一段时间可能更适合这个任务。这样,您就不需要为提示选择编写两次代码
int choiceentry;
do {
System.out.println("Enter \"1\", \"2\" or \"3\"");
choiceentry = scanchoice.nextInt();
switch (choiceentry)
{
case 1:
// do something
break;
case 2:
// ..something else
break;
case 3:
// .. exit program
break;
default:
System.out.println("Choice must be a value between 1 and 3.");
}
} while (choiceentry != 3);
使用switch不是更好吗?我已经尝试实现了您的建议,但在do循环的初始部分,对于语句“choiceentry=scanchoice.nextInt();”,我一直在线程“main”java.util.NoSuchElementException处收到一个“Exception in thread”异常,但我不完全确定如何或为什么。您可能需要按照建议将对
nextInt()
的调用封装在if语句中。不要忘了在开关之前的某个地方初始化choiceentry
。好的,所以代码现在应该可以工作了,除非我得到一个案例的无限循环,我不认为break语句会让我回到可以输入新值来执行下一个“choice”的点。编辑:在查看程序经过的循环后,中断正在工作,它正在打印“Enter”1、“2”或“3”,但它只是接受旧的选择值并继续,不允许输入新的选择值。我可能会误解,但此代码中是否有额外的大括号:/?哈哈哈,关闭了以前打开的大括号(隐藏)。。现在,删除它:)