Ich habe eine Klasse, die mehrere Integer-Objekte in einer verketteten Liste wie folgt erzeugt:
%Vor%Ich habe eine Anwendung, die nach der Eingabe "add" von der Konsole sucht und, falls gefunden, ruft die Methode add wie folgt auf:
%Vor%}
Die Anwendung sollte es dem Benutzer erlauben, "add" so oft wie gewünscht einzugeben, aber der Fehler "no line found" erscheint, nachdem die add-Methode aufgerufen wurde.
Dies liegt daran, dass der Scanner in der Methode nicht geschlossen und dann bei Bedarf neu geöffnet wurde. Ist das was falsch mit dem Programm und wenn ja, wie würde ich es beheben?
Bitte beachten Sie, dass dieses Programm nicht abgeschlossen ist, da ich eine Verkaufsmethode hinzufügen werde, die diese Anteile verkauft, weshalb ich eine While-Schleife verwende.
Mehrere Wrapper für jeden Stream sind eine gute Möglichkeit, sich wirklich zu verwirren. Ich schlage vor, du wickelst nur einmal einen Stream, wenn du nicht genau weißt, was du tust.
Der einfachste Weg dies zu tun ist, in diesem Fall ein Singleton zu verwenden, da es ein anderes Singleton umschließt (das Beste ist, den Scanner als Argument zu umgehen)
%Vor%Ich rate, weil der Scanner in der Methode nicht geschlossen wurde
Sobald Sie einen Stream schließen, wird der zugrunde liegende Stream geschlossen und Sie können ihn nicht mehr verwenden. Schließen Sie System.in nur, wenn Sie verhindern möchten, dass es erneut verwendet wird.
Wie würde ich es beheben?
Die beste Lösung ist, wenn Sie alle Scanner an einem Ort, einer Methode oder einer Klasse verwenden. Sie haben Ihre main () die gesamte Interaktion mit dem Benutzer und übergeben Sie die Werte an Ihre Datenstruktur. Objekte zu haben, die sich selbst initialisieren, ist eine schlechte Übung, und wenn du anfängst, dies zu tun, wird es dich für den Rest deiner Entwicklungstage plagen;) (Ernsthaft wirst du das immer wieder sehen und es ist oft ein Albtraum)
BTW Verlasse nie ein Programm ohne Erklärung. Der Aufruf von System.exit(0);
ohne eine Fehlermeldung ist ebenfalls ein Albtraum. Ich habe einmal an einem Projekt gearbeitet, das 260 Aufrufe von System.exit () hat, oft ohne eine Fehlermeldung. Sie können sich vorstellen, wie viel Spaß es macht, einen Server zu diagnostizieren, der ohne ersichtlichen Grund stoppt.
Ein erster Fehler ist, dass diese Codezeile
ist %Vor%schließt die System.in, nicht nur das scanInt-Objekt. Das bedeutet, dass das Scanobjekt nach dem ersten hinzuzufügenden Aufruf nur die bereits vorhandene Eingabe verwendet und Sie dann eine NoSuchElementException erhalten: Diese Zeile entfernen.
Wenn Sie jetzt die letzte Zeile mit dieser ersetzen,
%Vor%Sie werden sehen, dass die letzte Eingabe, die Sie vor dem Beenden erhalten, eine leere Zeichenfolge ist. In der nächsten Schleife geben Sie die else-Anweisung ein und Ihr Programm stoppt die Ausführung. Sie können dieses Problem beheben, indem Sie Folgendes hinzufügen:
%Vor%Allerdings stimme ich Peter zu, dass Sie nicht mehrere Wrapper verwenden sollten. Erwägen Sie, das Scanner-Objekt als Argument im Freigabeklassen-Kontrahenten zu übergeben.
Haben mehrere Scanner (im gleichen Stream) ist eine sehr schlechte Praxis, weil Scanner den Strom verbrauchen sie teilen.
Ich habe beim Debuggen des Quellcodes verifiziert und nach Scanner
class gesucht, die ich gefunden habe:
Wenn also eine Scanner-Instanz ihren Stream konsumiert, liest sie im Grunde nur eine Menge Bytes (1024) und die Position des Streams wird nach vorne verschoben.
Wenn zum Beispiel die Methode nextLine()
aufgerufen wird, kopiert die source.read()
hinter den Kulissen das Ergebnis in den privaten Puffer.
Offensichtlich wird der Status eines anderen Scanners beschädigt (ungültig).
Versuchen Sie, den Java-Quellcode selbst zu debuggen und / oder betrachten Sie die Methode Scanner.readInput()
.
Tags und Links java java.util.scanner