Zum Inhalt springen

Ein- und Ausgabe im Terminal

Bisher haben unsere Programme nur etwas ausgegeben. Jetzt reden sie auch mit uns: Sie fragen nach Werten und rechnen damit weiter.

  • Ausgaben mit print, println und printf gestalten
  • Zahlen und Texte mit einem Scanner einlesen
  • einem Programm beim Start Argumente mitgeben
  • die drei häufigsten Stolperfallen beim Einlesen erkennen
Ausgabe.java
package de.drv;
public class Ausgabe {
public static void main(String[] args) {
System.out.print("Hallo ");
System.out.print("Welt");
System.out.println("!");
System.out.println("Nächste Zeile");
int a = 3;
int b = 4;
System.out.println("Summe: " + a + b);
System.out.println("Summe: " + (a + b));
System.out.println(a + b + " ist die Summe");
}
}
Terminal-Fenster
Hallo Welt!
Nächste Zeile
Summe: 34
Summe: 7
7 ist die Summe
  • print gibt aus und bleibt in der Zeile, println beginnt danach eine neue.
  • Mit + hängst du Texte und Werte aneinander.

Manche Zeichen kann man nicht einfach in einen Text schreiben. Dafür gibt es Escape-Sequenzen mit Backslash:

Schreibweise Bedeutung
\n neue Zeile
\t Tabulator
\" Anführungszeichen im Text
\\ ein Backslash – z. B. in Windows-Pfaden: "C:\\dev"

Mit printf legst du ein Muster fest, in das die Werte eingesetzt werden:

Formatiert.java
package de.drv;
public class Formatiert {
public static void main(String[] args) {
String name = "Anna";
int alter = 19;
double groesse = 1.7234;
System.out.printf("%s ist %d Jahre alt und %.2f m groß.%n", name, alter, groesse);
System.out.printf("%-10s%8.2f%n", "Brot", 2.49);
System.out.printf("%-10s%8.2f%n", "Butter", 1.99);
System.out.printf("%-10s%8.2f%n", "Summe", 4.48);
}
}
Terminal-Fenster
Anna ist 19 Jahre alt und 1,72 m groß.
Brot 2,49
Butter 1,99
Summe 4,48

Jedes %… im Muster ist ein Platzhalter. Die Werte dahinter werden der Reihe nach eingesetzt:

Platzhalter Bedeutung Beispiel → Ergebnis
%d ganze Zahl 42 → 42
%f Kommazahl (6 Nachkommastellen) 3.5 → 3,500000
%.2f Kommazahl mit 2 Nachkommastellen 1.7234 → 1,72
%s Text "Anna" → Anna
%c Zeichen 'J' → J
%b Wahrheitswert true → true
%n neue Zeile
%8.2f mindestens 8 Zeichen breit, rechtsbündig 2.49 → 2,49
%-10s mindestens 10 Zeichen breit, linksbündig "Brot" → Brot
%05d 5 Stellen, mit Nullen aufgefüllt 42 → 00042

Zum Einlesen verwenden wir einen Scanner. Das ist ein fertiges Objekt aus der Standardbibliothek: Wir erzeugen es mit new und benutzen es einfach. Wie das im Detail funktioniert, sehen wir uns später an.

Begruessung.java
package de.drv;
import java.util.Scanner;
public class Begruessung {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Wie heißt du? ");
String name = scanner.nextLine();
System.out.print("Wie alt bist du? ");
int alter = scanner.nextInt();
System.out.println("Hallo " + name + "!");
System.out.println("In zehn Jahren bist du " + (alter + 10) + ".");
scanner.close();
}
}
Terminal-Fenster
Wie heißt du? Anna
Wie alt bist du? 19
Hallo Anna!
In zehn Jahren bist du 29.
  • Scanner liegt im Package java.util – deshalb die import-Zeile. Tipp Scan und Strg+Leertaste, dann fügt Eclipse sie selbst ein.
  • new Scanner(System.in) erzeugt einen Scanner, der von der Tastatur liest.
  • scanner.close() gibt ihn am Ende wieder frei. Fehlt die Zeile, warnt Eclipse: Resource leak: ‘scanner’ is never closed.

Die wichtigsten Methoden:

Methode liest Ergebnis
nextInt() eine ganze Zahl int
nextLong() eine große ganze Zahl long
nextDouble() eine Kommazahl double
next() ein Wort (bis zum nächsten Leerzeichen) String
nextLine() den Rest der Zeile String
Kreis.java
package de.drv;
import java.util.Scanner;
public class Kreis {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Radius: ");
double radius = scanner.nextDouble();
double flaeche = Math.PI * radius * radius;
System.out.println("Fläche: " + flaeche);
System.out.printf("Fläche: %.2f%n", flaeche);
scanner.close();
}
}
Terminal-Fenster
Radius: 2,5
Fläche: 19.634954084936208
Fläche: 19,63

Auch der Scanner richtet sich nach der Spracheinstellung: Auf einem deutschen Rechner erwartet er ein Komma. Tippst du 2.5, bricht das Programm ab:

Terminal-Fenster
Radius: 2.5
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:977)
…

Im Quelltext dagegen schreibst du Kommazahlen immer mit Punkt: 2.5.

Tauschen wir in der Begrüßung die Reihenfolge – erst das Alter, dann der Name:

Reihenfolge.java
package de.drv;
import java.util.Scanner;
public class Reihenfolge {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Wie alt bist du? ");
int alter = scanner.nextInt();
System.out.print("Wie heißt du? ");
String name = scanner.nextLine();
System.out.println("Hallo " + name + ", du bist " + alter + ".");
scanner.close();
}
}
Terminal-Fenster
Wie alt bist du? 19
Wie heißt du? Hallo , du bist 19.

Das Programm wartet gar nicht auf den Namen. Der Grund: Du hast 19 und Enter getippt. nextInt() nimmt sich nur die 19 – das Enter bleibt übrig. nextLine() liest „den Rest der Zeile“, findet sofort das Enter und liefert einen leeren Text.

Lösung: Nach nextInt() (oder nextDouble()) das übrige Zeilenende abholen, bevor du mit nextLine() weiterliest:

int alter = scanner.nextInt();
scanner.nextLine();
System.out.print("Wie heißt du? ");
String name = scanner.nextLine();

Tippst du bei nextInt() etwas ein, das keine Zahl ist, bricht das Programm mit einer InputMismatchException ab. Eine Exception ist eine Ausnahme: Das Programm meldet, dass etwas nicht geklappt hat. Wie man darauf reagiert, lernen wir später. Bis dahin gilt: richtig tippen.

Seit Kapitel 1 steht in jeder main-Methode String[] args. Jetzt wird es Zeit, das zu benutzen: args enthält die Argumente, die beim Start mitgegeben werden.

Summe.java
package de.drv;
public class Summe {
public static void main(String[] args) {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
System.out.println(a + " + " + b + " = " + (a + b));
}
}
  • args[0] ist das erste Argument, args[1] das zweite. Gezählt wird ab 0.
  • Argumente sind immer Texte. Integer.parseInt(…) macht aus einem Text eine ganze Zahl, Double.parseDouble(…) eine Kommazahl.

Die übersetzten Klassen liegen im Ordner bin des Projekts – du kennst das aus Kapitel 3:

PowerShell
cd C:\dev\eclipse-workspace\04-ein-ausgabe
java -cp bin de.drv.Summe 3 4
Terminal-Fenster
3 + 4 = 7

Starte Summe zuerst ganz normal mit Run As → Java Application. Das scheitert, weil keine Argumente da sind:

Terminal-Fenster
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

Eclipse hat dabei aber eine Startkonfiguration angelegt. Öffne Run → Run Configurations…, wähle links Summe, wechsle rechts in den Reiter Arguments und trage bei Program arguments ein: 3 4. Klicke auf Run.

Meldung Ursache
Scanner cannot be resolved to a type import java.util.Scanner; fehlt – Strg+Umschalt+O
Resource leak: ‘scanner’ is never closed (Warnung) scanner.close(); am Ende fehlt
InputMismatchException Eingabe passt nicht zum Typ – oder Punkt statt Komma
nextLine() liefert einen leeren Text Vorher nextInt() oder nextDouble() – Zeilenende abholen
ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 Keine Programm-Argumente angegeben
NumberFormatException: For input string: "…" Argument ist keine Zahl – oder Komma statt Punkt
  1. Lies Länge und Breite eines Rechtecks ein und gib Fläche und Umfang aus.

  2. Lies eine Temperatur in Celsius ein und gib sie in Fahrenheit aus – mit einer Nachkommastelle.

  3. Lies Vorname, Nachname und Geburtsjahr ein und gib aus: Nachname, Vorname (Jahrgang 2007). Achte auf Stolperfalle 2.

  4. Gib einen kleinen Kassenbon mit drei Artikeln aus, Preise rechtsbündig untereinander, darunter die Summe.

  5. Schreibe ein Programm Mittelwert, das drei Zahlen als Programm-Argumente bekommt und ihren Durchschnitt ausgibt. Starte es im Terminal und in Eclipse.