2013-12-19 80 views
0

我的程序包含用户可以通过多个,使它们能够完成特定任务的输入选择几个选项。目前,我的代码是用if和else if循环来完成任务,如果有一定数量的输入。但是,在一分钟后程序终止一个任务。我希望用户能够输入另一个号码来完成另一项任务。我试图用while循环和退出选项来绕过代码,以允许用户转义循环并结束程序,但这不起作用并导致“java.util.NoSuchElementException”。该程序工作正常,没有while循环。JAVA:创建菜单循环

这是当前代码的一个例子希望传达我的意思:

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 
    } 

} 

所以我想进入这个循环中,只有退出终止程序。我希望while循环能让用户回到菜单,允许你选择另一个选项,但这是行不通的。这段代码有什么问题?我怎样才能实现这个想法?

在此先感谢!

+1

这是不是更好地使用交换机? –

回答

2

使用Scanner#hasNextInt()打电话之前Scanner.nextInt()摆脱NoSuchElementException

if(scanchoice.hasNextInt()) 
choiceentry = scanchoice.nextInt(); 

hasNextInt()返回true仅如果下一个标记是有效的int

你可以这样做

//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; 
    } 

我已经改变它使用开关语句,因为他们来得到输入数据得心应手

+0

我可能会误解,但是在这段代码中有一个额外的大括号:/? – user2941526

+0

公顷哈哈,关闭上开括号(隐藏)。现在,删除它:) – Keerthivasan

2

您只是要求用户选择另一个菜单项,如果选择的是< 1> 3

你必须在else statement`设置此代码:如果你希望你的程序

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(); 

    } 

} 
1

继续提示用户选择你需要移动到某处该提示,以及您nextInt()调用你的循环内尚未if语句之外,这样它总是在每个迭代中调用的任务。

披先生的意见建议,switch语句将您当前的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); 
+0

我试图实现你的建议,但保留“在线程异常‘主’java.util.NoSuchElementException”接收的用于声明“choiceentry = scanchoice.nextInt();”在做循环的初始部分 – user2941526

+0

它适用于我,但我不完全确定如何或为什么。您可能需要按照建议的[这里](http://stackoverflow.com/a/20681686/2580649)将调用包装到if语句中的'nextInt()'中。不要忘记在交换机之前的某个地方初始化'choiceentry'。 – PakkuDon

+0

好的,所以现在代码应该可以工作,除非我有一个无限循环的情况,我不认为break语句让我回到可以输入新值来执行下一个“选择”的地步。编辑:看循环程序后,中断正在工作,它打印“输入”1“,”2“或”3“”,但它只是接受旧的选择价值和继续,并不允许进入一个新的。 – user2941526