0

最初のループの後、入力を待つために停止する前に、スイッチが 2 回実行されるのはなぜですか? 標準入力に char が残っていませんか? どうすれば問題を解決できますか?

while(true)
{
int choice = System.in.read();
switch(choice)
{
   case '1':
       break;
   default:
       break;
}
}
4

5 に答える 5

4

InputStream#readは単一の文字のみを読み取りbyte、改行文字(2文字にLFなりCRます。Windowsプラットフォームの場合)を消費せず、次の文字に渡しますread。これで、入力を受け取ったことがブロックされず、フローがケースにread流れ込みますdefault

BufferedReader代わりに使用して、完全な行を読むことができます。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
...
int choice = Integer.parseInt(br.readLine());
于 2013-03-08T14:52:07.073 に答える
2

時間をかけてドキュメントを読むと、このメソッドが 1 バイトのデータを受け取ることに気付くでしょう。データを入力した後に Enter キーを押すと、System.inストリームに別のバイトが追加されます。これは、Switch ステートメントで処理するデータが増えることを意味します。このようなストリームを読み取るには、スキャナーを使用する必要があります。


  Scanner s = new Scanner(System.in);
  // Create a scanner object that reads the System.in stream.
  int choice = s.nextInt();
  // Accept the next int from the scanner.
  switch(choice)
  {
    // Insert selection logic here.
  }
于 2013-03-08T14:53:38.167 に答える
1

もう一度どこかで選択肢を印刷すると、おそらく10と13が得られます。

  • 「10」はLF(改行制御文字)です。
  • 「13」はCR(キャリッジリターン制御文字)です。

これが、スイッチが2回実行されている理由です。

そして、入力を取得するためのより良い方法は、Reimeus、ChrisCooneyによってすでに示されています。

于 2013-03-08T15:02:37.227 に答える
0

これはInfinite Loop. 入力を取り続けるだけです。

次のようScannerに、 よりも入力を取得するためにa を使用する必要があります。System.in.read()

Scanner s = new Scanner(System.in);
while(true)
    {
        int choice = s.nextInt();
        if(choice == 1){
            break;
         }
    }
s.close();
于 2013-03-08T14:48:59.090 に答える
0

この場合、 Break to Labeled Statementを使用できます。詳細についてはhttp://www.javaspecialists.eu/archive/Issue110.html

作業コードは次のとおりです。

import java.io.IOException;

public class Switch {

    public static void main(String[] args) throws IOException {
        exitWhile: {
            while (true) {
                System.out.println("type>");
                int choice = System.in.read();

                switch (choice) {
                case '1':
                    break;
                default:
                    System.out.println("Default");
                    break exitWhile;
                }
            }
        }

    }
}
于 2013-03-08T14:54:20.727 に答える