Zum Inhalt springen

Problem beim Einlesen mit BufferedReader von Konsole


RalU

Empfohlene Beiträge

Hallo,

es geht um folgenden Quellcode:

import java.io.*;

/*

* Eingabe der Anzahl von Autos über Konsole

* Anschließend Eingabe der Richtung 'l' oder 'r' für jedes Auto

*/

public class Main

{

public static void main(String args[])

{

int value=0;

System.out.println("Bitte Anzahl für Autos eingeben: ");

//Verwendung von BufferedReader

BufferedReader br=

new BufferedReader(new InputStreamReader(System.in));

boolean erledigt=false;

while(!erledigt)

{

try

{

value=Integer.parseInt(br.readLine());

if(value<0)

{

System.out.println("Bitte nur Ganzzahl grösser 0 eingeben!");

}

else

{

erledigt=true;

}

}

catch(IOException e)

{

e.printStackTrace();

}

//Falls keine IntegerZahl eingegeben wurde, muss folgende Ex.

//geworfen werden -> die Schleife wird danach weiterhin

//durchlaufen

catch(NumberFormatException e)

{

System.out.println("Bitte Ganzzahl eingeben!");

}

}

//Beispielhaft für jedes Auto (also von 1 bis value)

//angeben, in welche Richtung es fahren soll

char richtung;

int i=0;

int tmp=i+1;

do

{

try

{

System.out.println("Bitte für das " + tmp + " te Auto angeben, " +

"welche Richtung es fahren soll (Eingabe von 'l' oder 'r')");

richtung=(char)br.read();//BufferedReader existiert weiter oben schon

if(richtung=='l'||richtung=='r')

{

//hier wird später in für jeden Schleifendurchlauf ein neues Auto-Objekt erstellt

System.out.println("neues Auto-Objekt mit Richtung "

+ richtung + " wurde erstellt!");

i++;

tmp++;

}

}

catch(IOException e)

{

e.printStackTrace();

}

}

while(i<value);

}

}

Zunächst gibt der Benutzer einen INT-Wert für die Anzahl der Autos ein.

In der 2. Schleife soll dann der Benutzer für jedes Auto eine Richtung (Eingabe von 'l' order 'r') angeben, in dass das jeweilige Auto fahren soll. Der zuerst eingegebene INT-Wert, der dann in der Variablen value steht wird hierbei benötigt.

Das klappt auch alles ganz reibungslos.

Allerdings wird die rot markierte Textausgabe unabhängig von der Eingabe für value immer 3 mal hintereinander ausgegeben, nachdem ich die erste Eingabe vollzogen habe. Weiß jemand, woran das liegt? Vermutlich hab ich da irgendwo einen ganz dämlichen Fehler gemacht....

Vielen Dank für die Hilfe

Ralf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

vorweg, bitte das nächste Mal Code-Tags verwenden.

Seltsames Problem, dazu gleich. Davor noch 2 andere Hinweise: Guck dir mal deine erste Schleife an und überleg (oder teste), was passiert, wenn der Benutzer 0 als Anzahl eingibt. Das zweite ist, dass die Variable i in meinen Augen überflüssig ist.

Zum Problem: Wie ich das seh, hängt es mit der Methode read() vom BufferedReader zusammen. Ich hab sie mal probehalter gegen readLine ausgetauscht und den Datentyp von richtung in String geändert. Dann gehts, so wie du willst:

	

String richtung;

int tmp = 1;


	while(value >= 0)

	{

		try

		{

			System.out.println("Richtung vom " + tmp + ". Auto eingeben");

			richtung = br.readLine();//BufferedReader existiert weiter oben schon


			if(richtung.equals("l")||richtung.equals("r"))

			{

				System.out.println("neues Auto-Objekt mit Richtung "

							+ richtung + " wurde erstellt!");

				value--;

				tmp++;

			}

			}

		catch(IOException e)

		{

			e.printStackTrace();

		}

	}

Der genaue Grund für den 3-fachen Schleifendurchlauf ist mir allerdings auch rätselhaft.

Bearbeitet von Ulfmann
Link zu diesem Kommentar
Auf anderen Seiten teilen

Der genaue Grund für den 3-fachen Schleifendurchlauf ist mir allerdings auch rätselhaft.

So rätselhaft ist das Verhalten von deinem Programm gar nicht, wenn man die genaue Funktionsweise von read() kennt. Versucht doch einfach mal "Rechts" oder "rechts" ein zugeben, vielleicht wird dann einiges klarer :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Hinweis bringt mich (zumindest) leider nicht weiter. Mir ist klar, dass die Methode read() unterschiedlich parametrisiert werden kann, bloß das ist hier ja gar nich der Fall. Mit anderen Worten wird hier die parameterlose Methode benutzt.

Die API sagt nur das:

public int read()

throws IOException

Read a single character. This method will block until a character is available, an I/O error occurs, or the end of the stream is reached.

Warum das die Ursache sein kann/sollte, weshalb dieser oben beschriebene 3-fache Schleifendurchlauf erfolgt, check ich einfach nich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der größte Irrglauben besteht darin das ein Aufruf von read() eine direkte Eingabe des Benutzers abfordert. Dies ist aber nicht zwangsläufig der Fall, lediglich wenn der Eingabestrom leer ist wird der Benutzer um eine Eingabe gebeten. Da der StandardInput aber vom zu Grunde liegenden Betriebssystem für jedes Programm beim Start des Programms festgelegt wird, kann es sich hierbei aber auch um eine Datei anstatt der üblichen Tastatur handeln. Dann wird der Benutzer beim Aufruf von read() nie nach einer Eingabe gefragt.

Hier ein Beispiel zum Ausgeben einer Datei in der Console mit Hilfe von System.in. Das Programm ist zwar eher ein typisches C-Programm aber was mit C geht kann ja auch mit Java gehen.


import java.io.IOException;

import java.io.InputStreamReader;


public class Main {


    public static void main(String[] args) {

        InputStreamReader eingabe = new InputStreamReader(System.in);


	try {

	    int zeichen = eingabe.read();

	    while(zeichen != -1) {

	        System.out.print((char) zeichen);

		zeichen = eingabe.read();

	    }

	} catch (IOException e) {

	    System.err.println("Es ist ein Fehler beim lesen von System.in aufgetreten"

	        +"\nDie Ausgabe des InputStreams wird abgebrochen");

        }

    }


}

java Main <Main.java
Mit obigem Aufruf wird das Programm veranlasst seinen eigen Quellcode auf der Konsole auszugeben. Aber kommen wir nun auf das Problem des mehrmaligen Schleifendurchlaufs zurück. Bei der Eingabe von "rechts" wird das erste r als Rechts gewertet und ein neues Auto-Objekt erstellt. Im Eingabestrom steht jetzt aber immer noch "echts" also wird die Schleife noch weitere 5 mal durchlaufen, die in der Eingabe gefundenen Buchstaben werden verworfen, die Ausgabe erfolgt aber jedes mal. Erst nach dem der Eingabestrom leer ist hält das Programm wieder an und wartet auf eine Eingabe vom Benutzer. Allerdings habe ich jetzt die beiden nicht sichtbaren Zeichen 10 und 13 unterschlagen, was dazu führt das die Schleife nicht wie oben angedeutet 5 mal sondern 7 mal durchlaufen wird . Für definitive Benutzereingaben über die Console gibt es ab Java 1.6 das "Console"-Objekt. Hier ein Beispiel:

Console console = System.console();

if(console == null) {

	System.err.println("Es konnte kein Consolen-Objekt erstellt werden"

		+"\nStellen Sie sicher das keine Datei als Eingabe verwendet wird");

	System.exit(-1);

}


System.out.print("Eingabe : ");

String eingabeZeile = console.readLine();

System.out.println("Ihre Eingabe war: " +eingabeZeile);

Bearbeitet von Sofus
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...