JAVA:创建菜单循环

JAVA:创建菜单循环,java,infinite-loop,nested-loops,Java,Infinite Loop,Nested Loops,我的程序包含一些选项,用户可以通过输入一个数字来选择这些选项,从而完成特定的任务。目前,我的代码是通过if和elseif循环设置的,以在输入一定数量时完成任务。但是,在一个任务完成后程序终止的那一分钟。我希望用户能够输入另一个数字来完成另一项任务。我曾尝试使用while循环和exit选项来包围代码,以允许用户退出循环并结束程序,但这不起作用,并导致“java.util.NoSuchElementException”。程序在没有while循环的情况下运行良好 这是当前代码的一个示例,希望能传达我的

我的程序包含一些选项,用户可以通过输入一个数字来选择这些选项,从而完成特定的任务。目前,我的代码是通过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”,但它只是接受旧的选择值并继续,不允许输入新的选择值。我可能会误解,但此代码中是否有额外的大括号:/?哈哈哈,关闭了以前打开的大括号(隐藏)。。现在,删除它:)