- 1 Section
- 10 Lessons
- unbegrenzt
- Java Grundlagen10
- 1.1Java-Grundlagen: JDK, JVM, erstes Programm
- 1.2Variablen, Datentypen und Operatoren
- 1.3Kontrollstrukturen: if, else, switch
- 1.4Schleifen: for, while, do-while
- 1.5Arrays und Strings
- 1.6Methoden: Definition, Parameter, Rückgabe
- 1.7Fehlerbehandlung: try-catch-finally, Exceptions
- 1.8Einstieg in Klassen und Objekte
- 1.9Eingabe und Ausgabe: Scanner, System.out
- 1.10Praxisprojekt: Kleines Java-Programm von A bis Z
Eingabe und Ausgabe: Scanner, System.out
Bisher waren unsere Programme stumm wie Fische: sie liefen einmal durch, gaben vielleicht etwas auf den Bildschirm aus, und das war es. Aber echte Programme interagieren mit dem Benutzer – sie stellen Fragen, lesen Eingaben, geben darauf Ergebnisse aus. In dieser Lektion lernst du wie du in Java Eingaben vom Benutzer entgegennimmst (mit der Scanner-Klasse) und wie du Ausgaben macht (über System.out in verschiedenen Varianten).
Die Analogie: Stell dir dein Programm wie ein Restaurant vor. Der Kellner (Scanner) nimmt die Bestellung vom Gast entgegen. Die Küche verarbeitet alles. Und am Ende bringt der Kellner (System.out) das Ergebnis raus. Eingabe und Ausgabe sind die Schnittstellen zwischen deinem Programm und der Welt. Ohne sie hätte ein Programm keinen Sinn – wie ein Restaurant ohne Bestellannahme und ohne Servieren.
1) Ausgabe: System.out im Überblick
Die einfachste Form von Ausgabe kennst du schon: System.out.println("..."). Aber es gibt drei Varianten, die unterschiedlich nützlich sind. Klicke einen Tab, um sie zu vergleichen:
System.out.println("Hallo");
System.out.println("Welt");
System.out.println(42);
System.out.println(); // nur Zeilenumbruch
System.out.print("Hallo ");
System.out.print("Welt ");
System.out.print(42);
// → alles in einer Zeile, kein Umbruch
String name = "Anna";
int alter = 25;
double preis = 19.99;
System.out.printf("Name: %s%n", name);
System.out.printf("Alter: %d Jahre%n", alter);
System.out.printf("Preis: %.2f €%n", preis);
System.out.printf("%s, %d Jahre, zahlt %.2f€%n",
name, alter, preis);
%s = String, %d = Ganzzahl, %f = Kommazahl, %.2f = Kommazahl mit 2 Nachkommastellen, %n = Zeilenumbruch (plattformunabhängig, besser als \n). Reihenfolge der Argumente entspricht der Reihenfolge der Platzhalter. Auch nützlich: System.err.println() – für Fehlermeldungen, geht auf den separaten Fehler-Stream. In der Praxis nutzen größere Anwendungen statt System.out lieber einen Logger (java.util.logging, log4j, slf4j) – mit Log-Levels und konfigurierbarer Ausgabe.2) Eingabe mit der Scanner-Klasse
Für Eingaben gibt es java.util.Scanner. Ein Scanner liest aus einem Stream (Datenstrom) – das kann System.in sein (Tastatur), eine Datei, ein String. Aufbau:
public class EingabeBeispiel {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Wie heißt du? ");
String name = sc.nextLine();
System.out.print("Wie alt bist du? ");
int alter = sc.nextInt();
System.out.printf("Hallo %s, du bist %d Jahre alt!%n", name, alter);
sc.close(); // Scanner schließen – wichtig!
}
}
Drei Dinge passieren: Erstens importieren wir Scanner aus dem Paket java.util. Zweitens erstellen wir einen Scanner-Objekt mit System.in als Quelle. Drittens nutzen wir Methoden des Scanners (nextLine, nextInt, ...) um die Eingabe zu lesen.
3) Interaktive Demo: Scanner ausprobieren
Hier simulieren wir den Ablauf eines Programms mit Scanner. Tippe etwas ein und drück Enter – sieh wie das Programm die Eingabe verarbeitet:
nextInt() wird die Zahl gelesen, der Zeilenumbruch bleibt aber im Puffer liegen. Wenn du danach nextLine() aufrufst, liest es nur den verbliebenen Zeilenumbruch (leeren String). Workaround: nach jedem nextInt() ein zusätzliches sc.nextLine() aufrufen oder durchgehend nextLine() verwenden und selbst per Integer.parseInt(...) konvertieren.4) Scanner-Methoden im Überblick
Die Scanner-Klasse hat für jeden Datentyp eine eigene Methode. So weiß sie wie sie die Eingabe zu interpretieren hat. Hier die wichtigsten:
sc.close(). Damit gibst du das System-Resource frei. Noch besser ab Java 7: try-with-resources – damit wird der Scanner automatisch geschlossen:try (Scanner sc = new Scanner(System.in)) { ... }5) Robuste Eingabe: Validierung und Fehlerbehandlung
In der Praxis kommt von Benutzern oft Müll. Wenn du nextInt() aufrufst und der Benutzer tippt "abc" → InputMismatchException und Crash. Gute Programme prüfen die Eingabe und reagieren darauf. Hier ein robustes Muster:
int alter = -1;
while (alter < 0 || alter > 150) {
System.out.print("Alter (0-150): ");
if (sc.hasNextInt()) {
alter = sc.nextInt();
} else {
System.out.println("Bitte eine Zahl eingeben!");
sc.next(); // ungültige Eingabe verwerfen
}
}
System.out.println("Gültig: " + alter);
Drei Techniken kombiniert: Eine while-Schleife die bei ungültigen Werten erneut fragt. hasNextInt() als Vorabprüfung damit keine Exception fliegt. sc.next() im else-Block um die ungültige Eingabe zu „wegzuspülen" – sonst würde die Schleife ewig die gleiche fehlerhafte Eingabe lesen.
6) Dateien lesen mit Scanner
Scanner kann auch aus Dateien lesen – nicht nur von der Tastatur. Dafür übergibst du ein File-Objekt statt System.in. Da das schiefgehen kann (Datei nicht da, keine Rechte), brauchst du dabei die Fehlerbehandlung mit try-catch:
import java.io.FileNotFoundException;
import java.util.Scanner;
try (Scanner sc = new Scanner(new File("daten.txt"))) {
while (sc.hasNextLine()) {
String zeile = sc.nextLine();
System.out.println(zeile);
}
} catch (FileNotFoundException e) {
System.out.println("Datei nicht gefunden!");
}
Für komplexere Datei-Operationen (Schreiben, Binärdaten, große Dateien) gibt es viele weitere Klassen: BufferedReader, FileWriter, Files (mit NIO). Mehr dazu in K40b – Java Dateioperationen.
7) Format-Spezifikatoren im Detail
| Spezifikator | Bedeutung | Beispiel |
|---|---|---|
%s | String | "Anna" |
%d | Ganzzahl | 42 |
%f | Kommazahl (default 6 Stellen) | 3.141593 |
%.2f | Kommazahl, 2 Nachkomma | 3.14 |
%10d | Ganzzahl, mind. 10 Stellen breit | " 42" |
%-10s | String, linksbündig 10 breit | "Anna " |
%n | Zeilenumbruch (plattformunabhängig) | \n bzw. \r\n |
%% | Literales Prozentzeichen | % |
Zusammenfassung
Ausgabe: System.out.println (mit Umbruch), print (ohne), printf (formatiert mit Platzhaltern wie %s, %d, %.2f, %n). Eingabe mit Scanner: import java.util.Scanner; Scanner sc = new Scanner(System.in);. Methoden: nextLine() für Text, nextInt() für Ganzzahl, nextDouble() für Kommazahl. hasNextInt() prüft vorab ob die nächste Eingabe gültig wäre. Scanner immer schließen (sc.close oder try-with-resources). Robuste Validierung mit while-Schleife + hasNext-Methoden. Scanner kann auch Dateien lesen (mit File und FileNotFoundException).
