2012-01-13 6 views
1

私は、単一の行に整数のリストを入力するユーザーが必要なので、私はこれを書いた:Scannerを使用して1行から整数リストを読み取るときに無限ループが発生するのはなぜですか?

public static Integer[] readIntegers() 
{ 
    Scanner input = new Scanner(System.in); 
    List<Integer> list = new ArrayList<Integer>(); 
    do list.add(input.nextInt()); 
    while(input.hasNextInt()); 
    return list.toArray(new Integer[list.size()]); 
} 

をそれは永遠にループし続けます!スキャナに数字がない場合、hasNextInt()falseを返すと思われますか?前の方法を修正するにはどうすればよいですか?または、代わりにnextLine()を使用して文字列を吐き出す必要がありますか?

+1

http://stackoverflow.com/questions/1794281/java-infinite-loop-using-scanner-in-hasnextint –

+0

の複製のように見えるDIdあなたはstdinにEOFを送りますか? [ctrl + z in windows、ctrl + d in linux] – amit

+0

プログラム全体を 'ctrl + z 'しないでしょうか? –

答えて

3

System.in Enterキーを押すと「終了」しません。 このようにしたい場合は、whileの式で'\n'をチェックしてください。

一般的に、私は別の方法でそれを行うことを好む:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
String line = br.readLine(); // line == null indicates end of input. 

またはjava.io.Consoleを使用します。

また、whileの代わりにdo/whileを使用すると、入力が空の場合に問題が発生する可能性があります。

+0

良い答え。 'InputStreamReader'のエンコーディングを指定する必要がありますか?私は 'System.in'は' PrintStream'だから既にそれに関連付けられたエンコーディングを持っていると仮定しますが、おそらく 'InputStreamReader'はそれを拾わないでしょう。 –

1

私はあなたのプログラムは、次の入力を待っているので、あなただけのLinux上でWindows上ctrl+zまたはctrl+dを使用し、EOFを養うために...、あなたの標準入力に

EOFを入れていないと信じています。

+0

@ Eng.Fouad:コマンドラインからメソッドへの入力をしています。コマンドラインは長いファイルのようなもので、EOFが出るまで読み込みを続けます。あなたの標準にEOFを手動でフィードしてください。 – amit

+0

eclipse(ウィンドウ) 'java.util.NoSuchElementException'でctrl + zを試したときにこの例外が発生しました –

+1

スキャナは" NoSuchElementException - 入力が使い果たされた場合 "をスローします。http://docs.oracle.com/javase/1.5を参照してください。 .0/docs/api/java/util/Scanner.html#nextInt%28%29 – fasseg

1

ただ1行を読み、その内容をScannerに入れるとよいでしょう。このようにして、ユーザーはEOFを入れる必要はなく、単にEnterを押します。

また、do...whileではなく、whileループが必要です。数字が入力されていない可能性があります。 do...whileは最初に1回の反復処理後に条件をチェックするので、コードには少なくとも1つの整数が存在していなくても読み込みを試みます。

関連する問題