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.
Was du am Ende kannst
Abschnitt betitelt „Was du am Ende kannst“- Ausgaben mit
print,printlnundprintfgestalten - Zahlen und Texte mit einem
Scannereinlesen - einem Programm beim Start Argumente mitgeben
- die drei häufigsten Stolperfallen beim Einlesen erkennen
Ausgabe
Abschnitt betitelt „Ausgabe“print und println
Abschnitt betitelt „print und println“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"); }
}Hallo Welt!Nächste ZeileSumme: 34Summe: 77 ist die Summeprintgibt aus und bleibt in der Zeile,printlnbeginnt danach eine neue.- Mit
+hängst du Texte und Werte aneinander.
Sonderzeichen
Abschnitt betitelt „Sonderzeichen“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" |
Formatierte Ausgabe mit printf
Abschnitt betitelt „Formatierte Ausgabe mit printf“Mit printf legst du ein Muster fest, in das die Werte eingesetzt werden:
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); }
}Anna ist 19 Jahre alt und 1,72 m groß.Brot 2,49Butter 1,99Summe 4,48Jedes %… 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 |
Eingabe mit Scanner
Abschnitt betitelt „Eingabe mit Scanner“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.
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(); }
}Wie heißt du? AnnaWie alt bist du? 19Hallo Anna!In zehn Jahren bist du 29.Scannerliegt im Packagejava.util– deshalb dieimport-Zeile. TippScanund 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 |
Drei Stolperfallen
Abschnitt betitelt „Drei Stolperfallen“1. Komma oder Punkt
Abschnitt betitelt „1. Komma oder Punkt“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(); }
}Radius: 2,5Fläche: 19.634954084936208Fläche: 19,63Auch der Scanner richtet sich nach der Spracheinstellung: Auf einem deutschen
Rechner erwartet er ein Komma. Tippst du 2.5, bricht das Programm ab:
Radius: 2.5Exception 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.
2. Erst Zahl, dann Text
Abschnitt betitelt „2. Erst Zahl, dann Text“Tauschen wir in der Begrüßung die Reihenfolge – erst das Alter, dann der Name:
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(); }
}Wie alt bist du? 19Wie 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();3. Keine Zahl eingegeben
Abschnitt betitelt „3. Keine Zahl eingegeben“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.
Programm-Argumente
Abschnitt betitelt „Programm-Argumente“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.
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.
Im Terminal
Abschnitt betitelt „Im Terminal“Die übersetzten Klassen liegen im Ordner bin des Projekts – du kennst das aus
Kapitel 3:
cd C:\dev\eclipse-workspace\04-ein-ausgabejava -cp bin de.drv.Summe 3 43 + 4 = 7In Eclipse
Abschnitt betitelt „In Eclipse“Starte Summe zuerst ganz normal mit Run As → Java Application. Das
scheitert, weil keine Argumente da sind:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0Eclipse 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.
Wenn es nicht klappt
Abschnitt betitelt „Wenn es nicht klappt“| 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 |
Übungen
Abschnitt betitelt „Übungen“-
Lies Länge und Breite eines Rechtecks ein und gib Fläche und Umfang aus.
-
Lies eine Temperatur in Celsius ein und gib sie in Fahrenheit aus – mit einer Nachkommastelle.
-
Lies Vorname, Nachname und Geburtsjahr ein und gib aus:
Nachname, Vorname (Jahrgang 2007). Achte auf Stolperfalle 2. -
Gib einen kleinen Kassenbon mit drei Artikeln aus, Preise rechtsbündig untereinander, darunter die Summe.
-
Schreibe ein Programm
Mittelwert, das drei Zahlen als Programm-Argumente bekommt und ihren Durchschnitt ausgibt. Starte es im Terminal und in Eclipse.