2016-08-21 13 views
0

現在、私はswitch文を使って遊んでいます。私はswitch文を使って複数のループがあるときに問題に遭遇します。Javaの複数のswitch文 - NoSuchElementException

私は二switchステートメントを終了すると(1まで行くためには)、Javaはjava.util.NoSuchElementExceptionスロー、と私は

switchOne = sc.nextInt(); 

ので、新しいユーザの入力をトリガすることになっている理由はかなりわかりませんか?

私は誰かが私にこれについていくつかの光を投げるのを助けることを望んでいます。 scannertry-with-resourcesなしで使用しようとしましたが、同じエラーが発生します。

public static void main(String[] args) { 

    int switchOne = 0; 
    int switchTwo = 0; 

    boolean breakAdmin = false; 

    try(Scanner sc = new Scanner(System.in)) { 

     while(true) { 
      System.out.println("Select one of the options below"); 
      System.out.println("1: Browse books"); 
      System.out.println("2: Get a coffe"); 
      System.out.println("3: See previously checkouts"); 
      System.out.println("0: Exit"); 
      System.out.print("Option: "); 

      switchOne = sc.nextInt(); 

      switch(switchOne) { 
       case 0: 
        return; 
       case 1: 
        System.out.println("!!You choose to browse over books, woohoo!!"); 
        break; 
       case 2: 
        System.out.println("!!Sit & relax"); 
        break; 
       case 3: 
        System.out.println("!!Let me get that list for you"); 
        break; 
       case 99: 
        System.out.println("We welcome you!"); 

        try(Scanner sc2 = new Scanner(System.in)) { 
         while(!breakAdmin) { 
          System.out.println("0: exit"); 
          System.out.println("1: something"); 

          switchTwo = sc2.nextInt(); 

          switch(switchTwo) { 
          case 0: 
           breakAdmin = true; 
           break; 
          case 1: 
           System.out.println("!!admin 1"); 
           break; 
          default: 
           System.out.println("!!This is the default case"); 
           break; 
          } 
         } 
        } 
        breakAdmin = false; 
        break;// case 99 ends 
       default: 
        System.out.println("!!This is the default case"); 
        break; 
      } // switch block ends 
     } // while loop ends 
    } // try with resources ends 
} 
+1

「switchOne = sc」の前に 'sc.nextLine();'を実行するとどうなりますか? nextInt(); '? – Gendarme

+1

ストリームの周りに親指のルールがあります: "あなたがそれを開いていない場合は、閉じないでください"。 'Scanner.close()'を呼び出すと 'Readable'が閉じられますので、try-with-resourcesを' Scanner'ラップ 'System.in'で使用しないでください。 JVMが行った)。 –

答えて

3

try(Scanner sc2 = new Scanner(System.in)) {

のtry-と資源構築物は、終了時に試してみる以内に作成されたリソースを閉じ、その後System.inを閉じるsc2.close()を呼んでいます。

この後、他のscから読み取ろうとすると、System.inから読み取ろうとします。しかし、それは閉じられて以来、もはや読むことが何もありません。

2番目のtryを削除するだけで修正するには、そこで作成したスキャナを閉じる必要はありません。

EDIT:入力ストリームには、指定された例外をスローする番号として解釈できないため、入力ストリームにクリアされない非番号(改行など)が含まれている可能性があります。ユーザ入力を扱うときには、Scanner.readLine()という行全体を読んで、入力などを自分自身に変換することをお勧めします。Integer.parseInt(...)

+0

'System.in'は本当に閉じますか?あなたはそれを説明するいくつかのドキュメントまたは同様のものを参照できますか?私の耳には奇妙な音がする。 – Gendarme

+0

2番目のtry-with-resourcesが削除されたときに動作します...理由はわかりません。この例のtry-with-resourcesはSystem.inを閉じます??しかし、オブジェクトの2つの異なるsystem.inですか? しかし、sc2を閉じるにはどうすればいいですか?例えばgigglesのadminメニューに99回入ると、99個のオブジェクトがメモリに残ってしまいます。 –

+0

@CristianMatthiasAmbækガベージコレクタの対象は何ですか。スキャナ自体はメモリ上に保持されておらず、読み込みを続けたい場合は 'System.in'を閉じたくありません。 – Kiskae