Scanner-Problem bei Eingabe

bluexar

Mitglied
Hallo Leute,

ich versuche gerade als Übung ein kleines Hangman-Programm zu schreiben, ich verzweifle aber leider schon am Anfang... ^^

Und zwar geht es um die Scanner-Klasse die ich zur Eingabe benutze. Der Code sieht so aus:


Java:
import java.util.*;
import java.io.PrintWriter;

public class Hangman {
	
	Scanner getTxt = new Scanner(System.in);
	PrintWriter printTxt = new PrintWriter(System.out);
	
	void startGame() {
		try{

		printTxt.println("\n");
		printTxt.println("Willkommen bei Hangman!");
		printTxt.println("Wollen Sie die Regeln durchlesen? (Y/N)");

		String antw;
		antw = getTxt.nextLine();

		if(antw.equals("Y")) {
			this.readRules();
		}

		}
		catch(InputMismatchException e) {
			System.err.println("Error!");
		}
	}
	
	void readRules() {
		printTxt.println("\n");
		printTxt.println("Regeln:");
		
	}
	
	public static void main(String[]args) {
		Hangman user = new Hangman();
		user.startGame();
		
		
		user.getTxt.close();
		user.printTxt.close();
	}
}

Wenn ich das Programm ausführe, sollte also zuerst der Text "Willkommen bei Hangman" kommen. Passiert aber nicht! Sondern es ist gleich am Anfang ein Eingabefeld, und erst wenn ich dann etwas eingegeben haben, kommt der Text.

Außerdem: Wenn ich bei diesem Eingabefeld "Y" eingebe, werden die Regeln ausgegeben, dass heißt es wird gleich am Anfang der Code von Zeile 15-17 ausgeführt, und der Rest wird einfach übersprungen!

Warum ist das so, und wie kann ich das ändern?

Vielen Dank im Vorraus,

ein verzweifelter bluexar.
 
Hallo 🙂

Der PrintWriter, den du zur Ausgabe verwendest, ist gepuffert - er wartet erst, bis ein interner Puffer voll ist, bevor die Daten ausgegeben werden. Das liegt daran, dass man ihn eigentlich zur Ausgabe in Datenströme wie Dateien usw. verwendet, wo es sinnvoll ist, so viel wie möglich auf einmal zu schreiben, statt vereinzelt ab und zu ein paar Bytes zu schreiben.

Lösung: Rufe [c]printTxt.flush();[/c] aus, um den Puffer zu leeren und in die Ausgabe zu schreiben. Also immer, nachdem du ein paar Zeilen ausgegeben hast und möchtest, dass sie angezeigt werden.

Bessere Lösung: Was willst du überhaupt mit dem PrintWriter? Verwendet doch System.out.println, das macht das automatisch, sodass du dich um solche Details nicht kümmern musst 🙂
 
Vielen, vielen Dank!

Bessere Lösung: Was willst du überhaupt mit dem PrintWriter? Verwendet doch System.out.println, das macht das automatisch, sodass du dich um solche Details nicht kümmern musst

Zum Abschluss noch eine Noob-Frage: Wie erstelle ich denn ein Objekt das direkt System.out.println benutzt? Also so etwas wie printTxt.
 
"out" ist bereits ein Objekt. Du kannst direkt sowas im Code schreiben:

Java:
System.out.println("Hallo, out!");
 

Zurück
Oben