RalU Geschrieben 22. Juli 2009 Geschrieben 22. Juli 2009 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 Zitieren
Ulfmann Geschrieben 22. Juli 2009 Geschrieben 22. Juli 2009 (bearbeitet) 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 22. Juli 2009 von Ulfmann Zitieren
Sofus Geschrieben 22. Juli 2009 Geschrieben 22. Juli 2009 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 Zitieren
Ulfmann Geschrieben 23. Juli 2009 Geschrieben 23. Juli 2009 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. Zitieren
Sofus Geschrieben 23. Juli 2009 Geschrieben 23. Juli 2009 (bearbeitet) 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 23. Juli 2009 von Sofus Zitieren
Empfohlene Beiträge
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.