2017-04-07 3 views
0

Warum kann ich die zweite Zeile nicht lesen, wenn ich die zweite Instanz von Scanner verwende? Ich bekomme eine "java.util.NoSuchElementException: No line found".java.util.Scanner zweite Instanz wirft NoSuchElementException

Ich verstehe, ich sollte die hasNextLine() verwenden und vermieden die Ausnahme, aber meine Frage ist, warum würde die zweite Zeile überhaupt nicht verfügbar sein? Der Grund dafür, dass es mehrere Scanner-Instanzen gibt, liegt auch darin, dass der Scanner in einer Methode instanziiert wird, die mehrere Male aufgerufen wird, und ich suche dort keine Lösung oder Lösung.

Bitte beachten Sie, dass ich weder die Scanner noch die Streams schließe. Ich lese nur jeweils 1 Zeile mit den Scannern, während ich 3 Zeilen im Stream habe.

Hier ist mein Programm vereinfacht:

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()); 
} 

Ausgang ist:

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

Niemals jemals zwei Scanner im gleichen Stream verwenden – freedev

+1

Und warum verwenden Sie einen ByteArrayInputStream, wenn Sie String-Zeilen lesen möchten ?! – GhostCat

+0

Verwenden Sie einfach den gleichen Scanner – Hackerman

Antwort

0

Verwenden mehrerer Scanner (auf derselben Stream) ist eine sehr schlechte Praxis, weil Scanner den Strom teilen sie verbrauchen.

Dies war die Ursache der Ausnahme java.util.NoSuchElementException: No line found, die Sie hatten.

Ich habe Ihren Code getestet und die Ausnahme wird um Sekunden nextLine() Aufruf ausgelöst.

In jeder Scanner Klasse wird eine Referenz auf den gleichen Eingabestrom gespeichert.

Wenn scanner1.nextLine() Methode aufgerufen wird, wird eine Reihe von Bytes im Stream gelesen und die Position wird nach vorne verschoben.

Nur um klar zu sein, habe ich überprüft, Debugging der Quellcode Scanner Klasse.

Wenn die nextLine() Methode aufgerufen wird, hinter den Kulissen der Strom vor

von 1024 Position Kopieren des Ergebnisses in einen Puffer bewegt wird
// Internal buffer used to hold input 
private CharBuffer buf; 

versuchen, den Java-Quellcode selbst debuggen und readInput() bei der Methode suchen.

+0

Danke! irgendwelche Dokumentation/Javadocs zu diesem Thema? – Jay

+0

Ja, die Position des Streams wird nach vorne verschoben, sollte jedoch um 1 Zeile nach vorne verschoben werden, nicht den gesamten Stream. – Jay

+0

Sie haben vergessen, dass es einen zugrunde liegenden Puffer gibt ... vielleicht liege ich falsch ... – freedev

Verwandte Themen