2015-04-20 94 views
0

我正在用Java進行一些測試以找出菜單驅動的控制檯應用程序。掃描儀 - 控制檯菜單應用程序中的NoSuchElementException

我有這樣的代碼:

public class TestClass { 

    public static void main(String[] args) { 

     int option = 99; 

     do{ 
      System.out.println("1. one"); 
      System.out.println("2. two"); 
      System.out.println("3. three"); 
      System.out.println("0. END"); 

      Scanner scan = new Scanner(System.in); 

      System.out.println("option : "); 

      option=Integer.parseInt(scan.next()); 
      scan.close(); 
      switch (option) { 
       case 0 : 
        System.exit(0); 
        break; 
       case 1 : 
        caseOne(); 
        break; 
       case 2 : 
        caseTwo(); 
        break; 
       case 3 : 
        caseThree(); 
        break; 
       default : 
        break; 

      } 


     } while (option!=0); 


    } 

    private static void caseOne(){ 
     System.out.println("Case ONE"); 
    } 

    private static void caseTwo(){ 
     System.out.println("Case TWO"); 
    } 

    private static void caseThree(){ 
     System.out.println("Case THREE"); 
    } 
} 

當我運行它,它工作得很好。 我選擇一個選項並打印出「CASE X」。

奇怪的行爲是當DO循環重新開始時。 它再次顯示菜單,但程序立即終止,顯示NoSuchElementException異常。 奇怪的是,它既不等我輸入數字。

如果除去

scan.close(); 

聲明它做工作正常altough編譯器警告我的內存泄漏,因爲掃描永遠不會關閉。

它的行爲非常奇怪,因爲在「第一遍」中即使使用te scan.close()但即使創建新的Scanner對象時它仍然會崩潰,因此我認爲它至少要求輸入。

我真的很困惑這一點。

有什麼建議嗎?

+0

完成閱讀。 – silentprogrammer

+1

將'scan.close();'放在方法末尾,'Scanner scan = new Scanner(System.in);'在'do'語句之前 – TheLostMind

+1

沒有理由關閉從System .in'。您可以忽略IDE警告,或者像@TheLostMind所說的那樣做。 – Radiodef

回答

0

如果您正在關閉scanner它將關閉包裹input stream也,因此您可以完成所有工作後關閉掃描。

scan.close(); 

把它放在do-while之後。

0

這裏更好的辦法,你可以因爲你這樣做`scan.close()`它將無法讀取further.Solution是給你當移動語句外循環關閉流實現它

public static void main(String[] args) { 

    int option = 99; 

    do{ 
     System.out.println("1. one"); 
     System.out.println("2. two"); 
     System.out.println("3. three"); 
     System.out.println("0. END"); 

     Scanner scan = new Scanner(System.in); 

     System.out.println("option : "); 

     option= scan.nextInt(); 
     switch (option) { 
      case 0 : 
       System.exit(0); 
       break; 
      case 1 : 
       caseOne(); 
       break; 
      case 2 : 
       caseTwo(); 
       break; 
      case 3 : 
       caseThree(); 
       break; 
      default : 
       scan.close(); 
       break; 

     } 


    } while (option!=0); 


} 
+0

...但如果我這樣做,如果用戶意外鍵入一個不支持的選項,它會不情願地關閉流... – metalredstar

+0

@metalredstar肯定但默認是用來結束任何參數和upvote它,如果你認爲它是幫助你的答案 –