2017-04-07 4 views
0

Scannerの2番目のインスタンスを使用して2行目を読み取ることができないのはなぜですか?私は "java.util.NoSuchElementException:No line found"を取得します。java.util.Scanner 2番目のインスタンスがNoSuchElementExceptionをスローする

私はhasNextLine()を使用して例外を回避すべきだと理解していますが、私の質問はなぜ2行目が利用できないのでしょうか?また、複数のスキャナインスタンスが存在する理由は、実際にはスキャナが複数回呼び出されるメソッドでインスタンス化されているため、そこに解決策や修正を探すのではないからです。

スキャナまたはストリームのいずれも閉じていないことに注意してください。私はストリームに3行を持っている間、スキャナを使ってそれぞれ1行しか読んでいません。ここで

は、私のプログラムが簡略化されている:

private void scanLines() { 
    String input = "Line 1." + System.lineSeparator() 
       + "Line 2." + System.lineSeparator() 
       + "Line 3." + System.lineSeparator(); 

    ByteArrayInputStream bais = new ByteArrayInputStream(input.getBytes()); 

    Scanner scanner1 = new Scanner(bais); 
    System.out.println(scanner1.nextLine()); 

    Scanner scanner2 = new Scanner(bais); 
    System.out.println(scanner2.nextLine()); 
} 

出力は次のようになります(同じストリーム上)

Line 1. 
Exception in thread "main" java.util.NoSuchElementException: No line found 
     at java.util.Scanner.nextLine(Unknown Source) 
     at ScannerTest.scanLines(ScannerTest.java:23) 
     at ScannerTest.main(ScannerTest.java:6) 
+2

同じストリームで2つのスキャナを使用したことはありません – freedev

+1

文字列の行を読みたいときに、なぜByteArrayInputStreamを使用していますか? – GhostCat

+0

同じスキャナを使用する – Hackerman

答えて

0

使用する複数のスキャナスキャナは、彼らが共有ストリームを消費するので、非常に悪い習慣です。

これは例外java.util.NoSuchElementException: No line foundの原因です。

コードをテストしましたが、例外は2回目のnextLine()呼び出しによって発生します。

Scannerには、同じ入力ストリームへの参照が保存されます。

scanner1.nextLine()メソッドが呼び出されると、ストリーム上のバイトの束が読み取られ、その位置が先に移動します。

私はScannerクラスのソースコードのデバッグをダブルチェックしました。

nextLine()メソッドが呼び出されると、舞台裏ストリームが先にバッファ

// Internal buffer used to hold input 
private CharBuffer buf; 

に結果をコピーする1024位置の移動したJavaソースコードを自分でデバッグし、方法readInput()を見てみてください。

+0

ありがとう!任意のドキュメント/これに関するjavadocs? – Jay

+0

はい、ストリームの位置は先に移動しますが、ストリーム全体を消費するのではなく、1行先に移動する必要があります。 – Jay

+0

バッファがあるのを忘れています...多分私は間違っています... – freedev

関連する問題