最初のループの後、入力を待つために停止する前に、スイッチが 2 回実行されるのはなぜですか? 標準入力に char が残っていませんか? どうすれば問題を解決できますか?
while(true)
{
int choice = System.in.read();
switch(choice)
{
case '1':
break;
default:
break;
}
}
最初のループの後、入力を待つために停止する前に、スイッチが 2 回実行されるのはなぜですか? 標準入力に char が残っていませんか? どうすれば問題を解決できますか?
while(true)
{
int choice = System.in.read();
switch(choice)
{
case '1':
break;
default:
break;
}
}
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());
時間をかけてドキュメントを読むと、このメソッドが 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.
}
もう一度どこかで選択肢を印刷すると、おそらく10と13が得られます。
これが、スイッチが2回実行されている理由です。
そして、入力を取得するためのより良い方法は、Reimeus、ChrisCooneyによってすでに示されています。
これは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();
この場合、 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;
}
}
}
}
}