- Lernen
- Informatik & Informationswissenschaften
- Programmierung
- Java-Programmierung – Klassen, Vererbung, Collections und Streams
- Java-Programme kompilieren und starten
Erste Java-Programme kompilieren und starten
AnfängerEinheit 1 von 11 in Kurs: Java-Programmierung – Klassen, Vererbung, Collections und Streams
Was du lernst
- Baue ein vollständiges Java-Programm um eine main-Methode auf, mache es mit dem Compiler und dem Java-Programmstarter ausführbar, behebe Fehler, die es stoppen, und gib Text genau wie beabsichtigt aus.
- Baue ein Programm um die main-Methode aufErkenne die Teile eines minimalen Java-Programms, platziere Anweisungen richtig in der main-Methode und beachte die Regeln für Namen, geschweifte Klammern, Semikolons und Kommentare.
- Kompiliere und starte Programme und behebe FehlerMache Quellcode mit dem JDK zu einem lauffähigen Programm und unterscheide Kompilierfehler, Laufzeitfehler und Logikfehler, damit du sie finden und beheben kannst.
- Gib Text mit print und println ausGib Text und Werte zeilenweise auf dem Bildschirm aus, steuere den Beginn neuer Zeilen und verwende Escape-Sequenzen für Anführungszeichen, Tabulatoren und umgekehrte Schrägstriche.
- Baue ein Programm um die main-Methode auf
- Deklariere und ändere Variablen, wähle für jeden Wert einen passenden primitiven Datentyp und speichere und verbinde Text in String-Werten.
- Deklariere Variablen, weise ihnen Werte zu und ändere sieErstelle Variablen mit einem Datentyp und einem Namen, gib ihnen Werte, beachte die Namensregeln und sage den Wert jeder Variablen während des Programmablaufs voraus.
- Wähle einen primitiven Datentyp und schreibe LiteraleWähle den passenden primitiven Datentyp für ganze Zahlen, Dezimalzahlen, Zeichen und Wahrheitswerte, schreibe Literale jedes Typs und erkenne, wann ein Wert nicht in seinen Datentyp passt.
- Speichere Text und verknüpfe ihn durch KonkatenationSpeichere Text in String-Variablen und erstelle Ausgaben, indem du Strings, Zahlen und Variablen mit dem Operator + verknüpfst. Sage genau voraus, was ausgegeben wird.
- Deklariere Variablen, weise ihnen Werte zu und ändere sie
- Schreibe arithmetische Ausdrücke, die Java in der beabsichtigten Reihenfolge auswertet, verwende Ganzzahldivision und Divisionsrest korrekt und rechne mit Dezimalzahlen und der Math-Klasse.
- Schreibe Ausdrücke mit Operatoren und beachte die OperatorrangfolgeKombiniere Werte mit arithmetischen Operatoren, sage die Auswertungsreihenfolge in Java voraus und ändere Variablen mit zusammengesetzter Zuweisung und Inkrement.
- Verwende Ganzzahldivision und DivisionsrestSage die Ergebnisse von / und % bei ganzen Zahlen voraus, teile damit Mengen in Einheiten auf und erkenne Divisionen durch null.
- Rechne mit Dezimalzahlen und der Math-KlasseRechne mit double-Werten, verwende die fertigen Methoden der Math-Klasse für Wurzeln, Potenzen und Rundung und gib Ergebnisse mit einer sinnvollen Anzahl von Nachkommastellen aus.
- Schreibe Ausdrücke mit Operatoren und beachte die Operatorrangfolge
- Sage voraus, welche Umwandlungen Java automatisch vornimmt, schreibe Casts, wenn eine Umwandlung Informationen verlieren kann, und wandle Text in Zahlen und Zahlen in Text um.
- Verwende erweiternde und explizite TypumwandlungenUnterscheide automatische erweiternde Typumwandlungen von einengenden, die einen Cast benötigen, platziere Casts so, dass Berechnungen das beabsichtigte Ergebnis liefern, und sage voraus, wie ein Cast einen Wert verändert.
- Wandle Text in Zahlen und Zahlen in Text umWandle Strings mit Zahlen in int- und double-Werte und Zahlen in Strings um und erkenne den Fehler, den Java bei Text ausgibt, der keine gültige Zahl ist.
- Verwende erweiternde und explizite Typumwandlungen
- Lies Text und Zahlen ein, die Nutzende eingeben, gib Ergebnisse in einem übersichtlichen Format aus und verbinde Eingabe, Verarbeitung und Ausgabe zu kleinen, getesteten Programmen.
- Lies Eingaben mit Scanner einErstelle einen Scanner für Tastatureingaben, lies Zeilen, Wörter und Zahlen mit der passenden Methode ein und vermeide häufige Fehler bei Zeilenenden, falschen Eingaben und Dezimaltrennzeichen.
- Formatiere Ausgaben mit printfGib Zahlen mit einer festen Anzahl von Nachkommastellen aus, richte Ausgaben mit printf und String.format in Spalten aus und verstehe, wie die Einstellungen des Computers das Dezimaltrennzeichen ändern.
- Verbinde Eingabe, Verarbeitung und AusgabePlane, schreibe und teste vollständige Programme, die Werte einlesen, mit passenden Datentypen damit rechnen und verständliche Ergebnisse ausgeben.
- Lies Eingaben mit Scanner ein
Java-Programme kompilieren und starten einfach erklärt
1Schreibe, kompiliere und starte ein Java-Programm
Ein Java-Programm beginnt als Text. Damit der Computer diesen Text als Anweisungen ausführen kann, braucht er jedoch eine genaue Struktur. Erstelle eine kleine Klasse um eine main-Methode und verfolge dann den Quellcode beim Kompilieren und Ausführen. Ausgegebene Meldungen machen jeden Schritt sichtbar. Wenn etwas fehlschlägt, zeigt dir die betreffende Phase, ob du den Quellcode prüfen, eine Laufzeitausnahme lesen oder das Ergebnis mit deiner Erwartung vergleichen solltest.
1.1 Baue ein Programm um die main-Methode auf
Ein erstes Java-Programm gibt dem Computer eine kurze Liste von Anweisungen. Die umgebende Klasse und die main-Methode zeigen Java, wohin diese Anweisungen gehören und wo die Ausführung beginnt.
Anweisungen in main platzieren
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
Die äußeren Klammern schließen den Klassenrumpf ein. Die inneren Klammern schließen den Methodenrumpf ein. Beim Start dieses Programms führt Java die erste Anweisung innerhalb von main aus. Weitere darunter stehende Anweisungen werden von oben nach unten ausgeführt. Wenn main endet, endet auch dieses kleine Programm.
Übernimm public static void main(String[] args) sorgfältig. Dabei erlaubt public dem Programmstarter, die Methode aufzurufen, static ermöglicht ihre Ausführung ohne vorherige Erzeugung eines Objekts und void besagt, dass die Methode kein Ergebnis zurückgibt. String[] args nimmt Wörter entgegen, die auf der Kommandozeile nach dem Programmnamen eingegeben werden. Du kannst eine Meldung ausgeben, ohne diese Wörter zu verwenden.
Satzzeichen und Namen abstimmen
Eine Anweisung wie System.out.println("Hi"); endet mit einem Semikolon. Zu einer öffnenden Klammer { gehört eine schließende Klammer }. Die oben gezeigten Klassen- und Methodenköpfe öffnen Blöcke; ersetze diese öffnenden Klammern nicht durch Semikolons. Rückst du die Anweisung gegenüber ihrem Methodenkopf um vier Leerzeichen ein, wird die Verschachtelung sichtbar.
Speichere public class Hello in Hello.java. Der Name der öffentlichen Klasse und der Teil vor .java müssen genau übereinstimmen, einschließlich der Großschreibung. Lautet die Deklaration public class Other, muss die Datei Other.java heißen. Eine Compilermeldung, dass die Klasse in einer anderen Datei deklariert werden sollte, weist auf diese Abweichung hin.
Java unterscheidet Groß- und Kleinschreibung. Der Name System muss mit einem großen S beginnen; system.out.println("Hi"); lässt sich nicht kompilieren. Eine Methode namens Main ist eine andere Methode als main. Eine Klasse, die nur Main enthält, lässt sich zwar kompilieren, aber der Programmstarter findet beim Ausführen die vorgesehene Einstiegsmethode nicht.
Code lesbar gestalten
Verwende eine Anweisung pro Zeile und vier Leerzeichen Einrückung für jede Klammerebene. Die meisten Leerzeichen und Zeilenumbrüche zwischen Codeelementen beeinflussen das Kompilieren nicht. Leerzeichen innerhalb von Text in Anführungszeichen beeinflussen die Ausgabe. Klassennamen stehen üblicherweise in PascalCase, wie bei TravelTime.
Ein Kommentar erklärt Menschen den Code. Java ignoriert alles, was in einer Zeile auf // folgt. Ein Blockkommentar beginnt mit /*, endet mit */ und kann sich über mehrere Zeilen erstrecken. Ein nützlicher Kommentar erklärt einen Grund, etwa // Convert hours to seconds neben einer Umrechnung, deren Zweck unklar sein könnte.
Die kürzere Form erkennen
Java 25 und spätere Versionen unterstützen auch eine kompakte Quelldatei:
void main() {
IO.println("Hello, world!");
}
Diese Form lässt die explizite Klassendeklaration weg. IO.println gibt eine Zeile aus und IO.readln("Your name: ") zeigt eine Eingabeaufforderung und gibt die eingegebene Zeile zurück. Die klassische Klassenform funktioniert auch mit älteren Java-Versionen; beide Formen enthalten eine main-Methode, in der die Ausführung beginnt.
Wichtige Erkenntnisse
- Platziere ausführbare Anweisungen innerhalb der main-Methode und schließe jede öffnende Klammer mit einer passenden schließenden Klammer.
- Beende eine Anweisung wie einen Ausgabeaufruf mit einem Semikolon.
- Die öffentliche Klasse
Hellogehört inHello.java; Groß- und Kleinschreibung sind wichtig. - Kommentare erklären den Code für Lesende und werden beim Kompilieren ignoriert.
- Java 25 ergänzt eine kompakte Quellcodeform; die klassische Klassenform funktioniert auch mit älteren Versionen.
1.2 Kompiliere und starte Programme und behebe Fehler
Quellcode schreiben und ein Programm ausführen sind getrennte Schritte. Java prüft und übersetzt zuerst deinen Code und führt ihn dann aus. Wenn du weißt, welcher Schritt fehlgeschlagen ist, kannst du entscheiden, wo du suchen musst.
Quellcode kompilieren, dann die Klasse starten
Quellcode ist der Text in einer .java-Datei. Der Compiler javac übersetzt gültigen Quellcode in Bytecode in einer .class-Datei. Die Java Virtual Machine (JVM) führt diesen Bytecode aus. Eine geeignete JVM ermöglicht es, denselben Bytecode auf verschiedenen Betriebssystemen auszuführen.
Öffne ein Terminal im Ordner, der Hello.java enthält, und gib ein:
javac Hello.java
java Hello
Der erste Befehl erstellt bei erfolgreicher Kompilierung Hello.class. Der zweite startet das Programm. Sein Argument ist der Klassenname ohne .class: Bei java Hello.class sucht der Programmstarter nach dem falschen Klassennamen und schlägt fehl.
Das JDK, das Java Development Kit, stellt beide Befehle bereit. Eine IDE, etwa IntelliJ IDEA, Eclipse, NetBeans oder Visual Studio Code mit Java-Unterstützung, kompiliert und startet das Programm, wenn du auf die entsprechende Schaltfläche klickst. Sie kann Fehler schon während der Eingabe markieren, aber es sind dennoch Fehler in derselben Sprache Java.
Seit Java 11 bietet der Quelldateimodus eine Abkürzung für ein einzelnes kleines Programm:
java Hello.java
Dies kompiliert den Quellcode im Arbeitsspeicher und führt ihn aus, ohne eine .class-Datei zu hinterlassen. Unterscheide die beiden Formen: java Hello startet eine kompilierte Klasse, während java Hello.java Quellcode startet.
Kompilierfehler lesen
Ein Kompilierfehler verhindert eine erfolgreiche Kompilierung. Ein fehlendes Semikolon kann zum Beispiel Folgendes auslösen:
Hello.java:3: error: ';' expected
System.out.println("Hello")
^
Die Meldung nennt Datei, Zeile und die Stelle, an der der Compiler das Problem bemerkt hat. Der eigentliche Fehler kann früher liegen: Ein nicht geschlossenes Anführungszeichen in einer Zeile kann spätere Zeilen durcheinanderbringen. Lies die markierte Zeile und die davor. Behebe den ersten gemeldeten Fehler und kompiliere erneut, bevor du mehrere andere Zeilen änderst. Eine Korrektur kann viele spätere Meldungen beseitigen.
Laufzeitfehler und falsche Ergebnisse unterscheiden
| Art des Problems | Was passiert | Wie du nach der Ursache suchst |
|---|---|---|
| Kompilierfehler | Der Quellcode lässt sich nicht erfolgreich kompilieren. | Lies die erste Compilermeldung und prüfe den Code in der Nähe. |
| Laufzeitfehler | Die Ausführung stoppt mit einer Ausnahme. | Lies die Ausnahme und suche die gemeldete Zeile. |
| Logikfehler | Die Ausführung endet, aber das Ergebnis ist falsch. | Vergleiche die Ausgabe mit einem von Hand berechneten Ergebnis. |
Enthält eine ganzzahlige Variable divisor den Wert null, schlägt 5 / divisor während der Ausführung mit ArithmeticException: / by zero fehl. Die Rechenanweisung kann gültiger Quellcode sein, obwohl ihre Werte zur Laufzeit zum Fehler führen.
Ein Programm, das einen Mittelwert von 8 ausgibt, obwohl der korrekte Wert etwa 8,33 beträgt, hat einen Logikfehler. Keine Compilermeldung kann dir sagen, dass dies für deine Aufgabe das falsche Ergebnis ist. Teste mit bekannten Eingaben, prüfe Zwischenwerte und suche die erste falsche Berechnung.
Arbeite in einem kurzen Zyklus: bearbeiten, speichern, kompilieren, starten, testen. Das Speichern ist wichtig: Der Compiler liest die gespeicherte Datei, daher können ungespeicherte Änderungen das kompilierte Programm nicht verändern.
Wichtige Erkenntnisse
javac Hello.javakompiliert Quellcode;java Helloführt die entstandene Klasse aus.- Das JDK stellt Entwicklungsbefehle bereit; die JVM führt Bytecode aus.
- Behebe den ersten Compilerfehler und kompiliere erneut, bevor du späteren Meldungen nachgehst.
- Eine Laufzeitausnahme stoppt die Ausführung; einen Logikfehler findest du durch den Vergleich mit einem erwarteten Ergebnis.
1.3 Gib Text mit print und println aus
Ausgaben sind die erste Möglichkeit zu sehen, was ein Programm tut. Java lässt dich steuern, welche Zeichen ausgegeben werden und wo die nächste Zeile beginnt.
Die Ausgabeposition verfolgen
System.out.print(...) gibt seinen Wert aus und belässt die Ausgabeposition in derselben Zeile. System.out.println(...) gibt seinen Wert aus und beginnt dann eine neue Zeile. Ein Aufruf von System.out.println() mit leeren Klammern fügt nur einen Zeilenumbruch hinzu.
System.out.print("Hello");
System.out.print(", ");
System.out.println("world");
System.out.println("Bye");
Nach den ersten beiden Aufrufen steht die Ausgabeposition hinter dem Leerzeichen nach dem Komma. Der dritte fügt an dieser Stelle world hinzu und wechselt dann in eine neue Zeile. Die genaue Ausgabe lautet:
Hello, world
Bye
Java fügt zwischen Aufrufen keine Leerzeichen ein. Entfernst du das Leerzeichen in ", ", lautet die erste Zeile „Hello,world“. Ein leeres println() zwischen den letzten beiden Anweisungen würde eine Leerzeile zwischen den Meldungen erzeugen.
Zwischen Text und Wert unterscheiden
Ein Stringliteral ist Text in doppelten Anführungszeichen. Die Ausgabe von "7 * 6" zeigt den Text „7 * 6“. Die Ausgabe von 7 * 6 wertet die Multiplikation aus und zeigt „42“. Die Anführungszeichen sind Satzzeichen des Codes; sie werden nicht als Teil des Literals ausgegeben.
Enthält name den Wert „Ada“, zeigt System.out.println(name); entsprechend „Ada“, während System.out.println("name"); „name“ anzeigt. Verwende die Variable ohne Anführungszeichen, wenn du ihren gespeicherten Wert möchtest.
Einfache Anführungszeichen haben eine andere Aufgabe. 'A' ist ein einzelner char-Wert. 'Hello' kann keine Nachricht aus mehreren Zeichen enthalten und verursacht einen Kompilierfehler. Verwende "Hello" für diesen Text.
Sonderzeichen in einen String einfügen
Eine Escape-Sequenz beginnt mit einem umgekehrten Schrägstrich und steht für ein Zeichen innerhalb des Literals.
| Code innerhalb eines Literals | Ausgegebenes Zeichen |
|---|---|
\n | Neue Zeile |
\t | Tabulator |
\" | Doppeltes Anführungszeichen |
\\ | Ein umgekehrter Schrägstrich |
Zum Beispiel:
System.out.println("She said \"hi\"");
System.out.println("C:\\Users");
Diese Anweisungen zeigen She said "hi" und C:\Users in getrennten Zeilen. Die zusätzlichen umgekehrten Schrägstriche zeigen Java, wie das folgende Zeichen zu deuten ist; sie werden nicht alle in die Ausgabe übernommen.
Ein einzelner Aufruf kann auch mehrere Zeilen ausgeben:
System.out.println("Name:\tAda\nAge:\t36");
Der Tabulator trennt die Beschriftung vom Wert, und \n setzt das Alter in die nächste Zeile. Der println-Aufruf fügt außerdem einen eigenen abschließenden Zeilenumbruch hinzu. Ein Tabulator springt zu einem Tabstopp, daher hängt seine sichtbare Breite von der Ausgabeumgebung ab.
Ein gewöhnliches Stringliteral in Anführungszeichen muss in derselben Quellcodezeile geöffnet und geschlossen werden. Drückst du mittendrin die Eingabetaste, bleibt das Literal ungeschlossen. Um eine lange Nachricht auf mehrere Quellcodezeilen aufzuteilen, schreibe zwei vollständige, mit + verbundene Literale oder verwende getrennte Ausgabeaufrufe.
Wichtige Erkenntnisse
printbleibt in der aktuellen Zeile;printlnfügt nach seinem Wert einen Zeilenumbruch hinzu.- Anführungszeichen machen Text zum Literal:
"name"gibt diese Buchstaben aus, währendnameden Wert der Variablen ausgibt. - Verwende Escape-Sequenzen für neue Zeilen, Tabulatoren, Anführungszeichen und umgekehrte Schrägstriche.
- Leerzeichen in einem String werden genau so ausgegeben; Ausgabeaufrufe fügen keine trennenden Leerzeichen hinzu.
- Verwende doppelte Anführungszeichen für einen String und einfache für einen einzelnen
char-Wert. - Ein gewöhnliches Stringliteral wird in einer Quellcodezeile geöffnet und geschlossen.
2Speichere Daten in Variablen des passenden Typs
Variablen ermöglichen es einem Programm, Werte zwischen Anweisungen zu speichern, doch jeder gespeicherte Wert hat einen Datentyp. Verfolge Zuweisungen Schritt für Schritt, um zu sehen, was sich ändert und was gleich bleibt. Wähle zu den Daten passende Typen für ganze Zahlen, Dezimalzahlen, Zeichen oder Wahrheitswerte und kombiniere dann Text und Werte zu lesbaren Meldungen. Kleine Unterschiede in der Schreibweise von Literalen oder in der Reihenfolge von Pluszeichen können sowohl den Typ als auch das Ergebnis eines Ausdrucks ändern.
2.1 Deklariere Variablen, weise ihnen Werte zu und ändere sie
Eine Variable gibt einem Wert einen Namen, damit spätere Anweisungen ihn verwenden können. Ihr Datentyp sagt Java, welche Art von Wert sie enthalten kann; eine Zuweisung ändert den gespeicherten Wert.
Deklarieren und initialisieren
int age;
age = 36;
Die Deklaration führt age als int ein. Die Zuweisung speichert 36. Die kombinierte Form int age = 36; heißt Initialisierung. Einer lokalen Variablen muss ein Wert zugewiesen werden, bevor du sie ausliest. Deklarierst du int age; und gibst age sofort aus, erhältst du einen Fehler, dass die Variable möglicherweise nicht initialisiert wurde.
Deklariere einen Namen im selben Methodenrumpf nur einmal. Um seinen Wert später zu ändern, schreibe age = 37;, ohne int zu wiederholen. Ein zweites int age = 37; in diesem Rumpf versucht, dieselbe Variable erneut zu deklarieren.
Zuweisungen von rechts nach links lesen
Die rechte Seite von = wird zuerst berechnet. Dann speichert Java das Ergebnis in der Variablen auf der linken Seite:
int count = 5;
count = count + 1;
Die zweite Anweisung liest den aktuellen Wert 5, addiert 1 und speichert 6. Das Zeichen = bedeutet Zuweisung, keine mathematische Aussage, dass eine Zahl gleich sich selbst plus eins ist. Die linke Seite muss einen Speicherort für den Wert benennen; 36 = age; ist ungültig.
Eine Zuweisung kopiert den Wert zum jeweiligen Zeitpunkt:
int a = 5;
int b = a;
a = 10;
Nun enthält a den Wert 10 und b den Wert 5. Es gibt keine dauerhafte Verknüpfung, die b neu berechnet, wenn sich a ändert.
Einen Tausch nachvollziehen
Angenommen, first enthält 4 und second enthält 9. Die Folge first = second; second = first; verliert die 4 im ersten Schritt und lässt beide Werte bei 9. Sichere zuerst den ursprünglichen Wert:
int temp = first;
first = second;
second = temp;
| Nach der Anweisung | first | second | temp |
|---|---|---|---|
int temp = first; | 4 | 9 | 4 |
first = second; | 9 | 9 | 4 |
second = temp; | 9 | 4 | 4 |
Eine Ablauftabelle hält jede Variable nach jeder Anweisung fest. Für int x = 3; x = x * 2; x = x + 1; lauten die Werte zunächst 3, dann 6 und schließlich 7. Aktualisiere jeweils eine Zeile anhand der zuletzt gespeicherten Werte.
Nützliche Namen und feste Typen wählen
Namen dürfen Buchstaben, Ziffern, Unterstriche und Dollarzeichen enthalten. Sie dürfen weder mit einer Ziffer beginnen noch ein reserviertes Wort wie class sein. Groß- und Kleinschreibung sind wichtig: total und Total unterscheiden sich. Verwende aussagekräftige Namen in camelCase wie distanceKm oder secondsLeft.
Einer final-Variablen kann nur einmal ein Wert zugewiesen werden. final int SECONDS_PER_HOUR = 3600; gibt einem festen Umrechnungsfaktor einen klaren Namen. Eine erneute Zuweisung lässt sich nicht kompilieren. Konstanten verwenden üblicherweise großgeschriebene Wörter, die durch Unterstriche getrennt sind.
Seit Java 10 kann der Typ einer lokalen Variablen mit var aus ihrem Initialisierungswert abgeleitet werden. Bei var count = 10; wird int abgeleitet, bei var price = 2.5; ist es double. Der abgeleitete Typ bleibt fest. var count; schlägt fehl, weil es keinen Initialisierungswert gibt, aus dem ein Typ abgeleitet werden kann.
Wichtige Erkenntnisse
- Eine Deklaration benennt eine Variable und ihren Typ; eine Initialisierung gibt ihr zusätzlich einen Anfangswert.
- Eine Zuweisung wertet die rechte Seite aus und speichert das Ergebnis dann links.
- Das Kopieren eines Werts verknüpft keine Variablen; verwende beim Vertauschen von Werten eine temporäre Variable.
- Lies eine lokale Variable erst aus, nachdem sie einen Wert erhalten hat.
finalverhindert eine erneute Zuweisung undvarleitet aus einem Initialisierungswert einen festen Typ ab.
2.2 Wähle einen primitiven Datentyp und schreibe Literale
Der Datentyp eines Werts bestimmt seinen Wertebereich, die Schreibweise seiner Literale und die Berechnungen, die Java damit ausführen kann. Verwende int für gewöhnliche Anzahlen und double für gewöhnliche Messwerte und lerne auch die anderen primitiven Datentypen kennen.
Die acht primitiven Datentypen vergleichen
| Typ | Speicherung und Werte |
|---|---|
byte | 8-Bit-Ganzzahl: −128 bis 127 |
short | 16-Bit-Ganzzahl: −32.768 bis 32.767 |
int | 32-Bit-Ganzzahl: −2.147.483.648 bis 2.147.483.647 |
long | 64-Bit-Ganzzahl: −9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 |
float | 32-Bit-Gleitkommazahl; etwa 7 signifikante Stellen |
double | 64-Bit-Gleitkommazahl; etwa 15–17 signifikante Stellen |
char | Eine 16-Bit-UTF-16-Codeeinheit: 0 bis 65.535 |
boolean | true oder false |
Endliche float-Werte reichen ungefähr von −3,4 × 10³⁸ bis +3,4 × 10³⁸; endliche double-Werte reichen ungefähr von −1,8 × 10³⁰⁸ bis +1,8 × 10³⁰⁸. Trotz dieser großen Wertebereiche lässt sich nicht jede Dezimalzahl darin exakt darstellen.
Ein char steht oft für ein einzelnes Zeichen, etwa 'A'. Manche Unicode-Zeichen benötigen zwei UTF-16-Codeeinheiten, daher kann ein einzelnes char nicht jedes mögliche Zeichen darstellen. 'A' hat den Zahlencode 65, 'a' den Wert 97 und '7' den Wert 55. Das Zeichen '7' ist etwas anderes als die ganze Zahl 7. Ein boolean ist keine Zahl: boolean active = 1; schlägt fehl.
Literale passend zu ihren Typen schreiben
Ein Literal schreibt einen Wert direkt in den Quellcode. 42 ist ein int-Literal, 42L ein long, 3.5 ein double und 3.5f ein float. Zeichenliterale verwenden einfache Anführungszeichen, Stringliterale doppelte. Die Namen primitiver Datentypen werden kleingeschrieben, während String mit einem Großbuchstaben beginnt.
Schreibe long large = 3000000000L;. Ohne das L ist dieses Ganzzahlliteral zu groß. Schreibe float rate = 3.5f;: Das einfache 3.5 hat den Typ double, den Java nicht stillschweigend zu float einengt. Eine passende ganzzahlige Konstante kann einen kleineren ganzzahligen Typ initialisieren: byte b = 100; lässt sich kompilieren, byte b = 200; jedoch nicht.
Unterstriche zwischen Ziffern machen ein Literal lesbar: 1_000_000 hat denselben Wert wie 1000000. Die wissenschaftliche Schreibweise verwendet e, wie in 1.5e3, was 1.500,0 bedeutet. Dezimalzahlen im Quellcode verwenden immer einen Punkt.
Den Wertebereich der Operation beachten
Bei einer Ganzzahlberechnung kann ohne Fehlermeldung ein Überlauf auftreten. Addierst du 1 zum größten int-Wert, springt das Ergebnis zum kleinsten int-Wert. Das Produkt 50_000 * 50_000 verwendet int-Arithmetik und ergibt -1794967296. In 50_000L * 50_000 ist ein Operand vom Typ long, daher ist das Produkt der korrekte Wert 2500000000.
Änderst du nur die aufnehmende Variable zu long, ist es zu spät, um ein int-Produkt zu korrigieren, bei dem bereits ein Überlauf aufgetreten ist. Wähle vor der Multiplikation einen Operanden mit einem ausreichend großen Wertebereich.
Gleitkommawerte haben eine andere Einschränkung. Viele Dezimalbrüche werden als binäre Näherungswerte gespeichert: 0.1 + 0.2 gibt 0.30000000000000004 aus. Formatiere solche Ergebnisse für die Anzeige. Bei exakten Geldberechnungen können ganze Centbeträge in einem long gespeichert werden; die Klasse BigDecimal ist eine weitere Möglichkeit für exakte Dezimalzahlen.
Wichtige Erkenntnisse
- Java hat acht primitive Datentypen;
Stringist eine Klasse. - Verwende das Suffix eines Literals, um
long(L) oderfloat(f) zu wählen. - Ganzzahlberechnungen können ohne Meldung überlaufen; wandle einen Operanden vor der Berechnung erweiternd um.
- Gleitkommatypen speichern viele Dezimalbrüche als Näherungswerte.
- Ein
charspeichert eine UTF-16-Codeeinheit, während einbooleaneinen Wahrheitswert speichert. - Eine Dezimalzahl im Quellcode verwendet einen Punkt, selbst auf einem Computer, der Dezimalkommas verwendet.
2.3 Speichere Text und verknüpfe ihn durch Konkatenation
Ein String enthält Text, einschließlich Leerzeichen, Ziffern und Satzzeichen, oder auch gar keine Zeichen. Der Operator + kann diesen Text mit anderen Werten zu einer Nachricht verbinden.
Werte zu Text verbinden
String firstName = "Ada";
String lastName = "Lovelace";
System.out.println(firstName + " " + lastName);
Die Ausgabe lautet „Ada Lovelace“. Das mittlere Literal liefert das Leerzeichen. Ohne es würde firstName + lastName „AdaLovelace“ ergeben. Die Konkatenation fügt keine Trennzeichen für dich hinzu.
Konkatenation bedeutet, Werte zu einem neuen String zu verbinden. Ist einer der Operanden von + ein String, wandelt Java den anderen Wert in Text um und verbindet beide. So wird "Age: " + 36 zu „Age: 36“ und "Price: " + 2.5 zu „Price: 2.5“. Die Ziffern im Ergebnis sind nun Teil eines Textwerts.
String beginnt mit einem großen S. Anders als die acht primitiven Datentypen ist es eine Klasse. string name = "Ada"; mit einem kleinen s lässt sich nicht kompilieren. Der leere String "" ist gültiger Text ohne Zeichen; er ist kein fehlender Wert.
Pluszeichen von links nach rechts verfolgen
Betrachte:
System.out.println("Sum: " + 2 + 3);
Das erste + verbindet den String und 2 zu „Sum: 2“. Das zweite verbindet diesen String und 3 zu „Sum: 23“. Sobald das laufende Ergebnis Text ist, verbindet das nächste + weiterhin Text.
Vergleiche drei Formen:
| Ausdruck | Ergebnis | Grund |
|---|---|---|
"Sum: " + 2 + 3 | "Sum: 23" | Bei der ersten Addition ist Text vorhanden. |
2 + 3 + " apples" | "5 apples" | Die erste Operation addiert zwei Zahlen. |
"Sum: " + (2 + 3) | "Sum: 5" | Durch die Klammern wird die Summe zuerst berechnet. |
Setze Klammern, wenn eine Nachricht das Ergebnis einer Addition oder Subtraktion enthalten soll. Zum Beispiel ergibt "Diff: " + (5 - 2) „Diff: 3“. Ohne Klammern versucht "Diff: " + 5 - 2, 2 von einem String zu subtrahieren, und lässt sich nicht kompilieren.
Multiplikation und Division haben eine höhere Rangfolge als +. Der Ausdruck "Area: " + 4 * 5 berechnet zuerst das Produkt und ergibt „Area: 20“.
Eine Nachricht schrittweise aufbauen
String message = "Hi";
message += "!";
Die geänderte Variable enthält „Hi!“. Bei einem String hängt += Text an, indem es das verbundene Ergebnis wieder der Variablen zuweist. Du kannst eine kurze Nachricht mit mehreren Anweisungen zusammensetzen und am Ende einmal ausgeben.
Achte auf Zeichen. Zwei char-Operanden lösen keine String-Konkatenation aus. 'A' + 'B' addiert ihre Zahlencodes 65 und 66 und ergibt den int-Wert 131. Der leere String am Anfang verändert die Kette: "" + 'A' + 'B' erzeugt zuerst „A“, dann „AB“. Anführungszeichen bestimmen die Typen der Operanden und damit auch die Bedeutung von +.
Wichtige Erkenntnisse
- Konkatenation verbindet Text; sie fügt keine zusätzlichen Leerzeichen ein.
- Eine Kette von
+-Operationen wird nach Operationen höherer Rangfolge von links nach rechts ausgewertet. - Setze eine Addition oder Subtraktion von Zahlen in Klammern, bevor du ihr Ergebnis mit einer Beschriftung verbindest.
- Zwei
char-Werte werden als Zahlen addiert, sofern nicht bereits ein String an der Operation beteiligt ist.
3Rechne mit arithmetischen Ausdrücken
Berechnungen hängen sowohl von der Rechenreihenfolge als auch von den Typen ihrer Operanden ab. Verfolge Ausdrücke vor ihrer Ausführung, besonders wenn eine Division Teil einer größeren Berechnung ist. Ganzzahldivision und Divisionsrest teilen Größen in Gruppen oder Zeiteinheiten auf; bei Dezimalrechnung bleiben Nachkommateile erhalten. Fertige Math-Methoden berechnen Wurzeln und Potenzen und runden Werte. Ihre Rückgabetypen sind wichtig, wenn du die Ergebnisse speicherst.
3.1 Schreibe Ausdrücke mit Operatoren und beachte die Operatorrangfolge
Ein Ausdruck kombiniert Werte und liefert ein Ergebnis. Java wertet ihn gemäß der Operatorrangfolge aus; anschließend kann eine Anweisung das Ergebnis speichern oder ausgeben.
Rechenoperationen ausdrücklich schreiben
Die arithmetischen Operatoren sind +, -, *, / und %: Addition, Subtraktion, Multiplikation, Division und Divisionsrest. Bei int width = 4; und int height = 5; ergibt width * height den Wert 20.
Jede Multiplikation braucht *. Die aus der Algebra vertraute Form 2(3 + 4) ist in Java ungültig; schreibe 2 * (3 + 4). Java hat keinen arithmetischen Potenzoperator. 2 ^ 3 bedeutet eine bitweise Operation und ergibt 1, nicht 8. Um einen Wert zu quadrieren, schreibe x * x; für eine andere Potenz verwende Math.pow.
Erst die Rangfolge beachten, dann von links nach rechts lesen
| Reihenfolge | Operatoren oder Gruppierung |
|---|---|
| Zuerst | Klammern |
| Danach | Unäres Minus und Casts |
| Danach | *, /, % |
| Zuletzt | +, - |
Auf derselben Stufe werden diese arithmetischen Operatoren von links nach rechts gruppiert. 2 + 3 * 4 ist 14; (2 + 3) * 4 ist 20. In 10 - 4 - 3 ergibt die erste Subtraktion 6 und die zweite 3. In 24 / 4 * 2 ergibt die Division 6 und die Multiplikation 12. Um 4 * 2 als Divisor zu behandeln, wären Klammern nötig.
Einen Mittelwert korrekt berechnen
Angenommen, es gilt int a = 7, b = 8, c = 10;. Der Ausdruck a + b + c / 3 dividiert nur c. Durch die Ganzzahldivision ist 10 / 3 gleich 3, und die anschließenden Additionen ergeben 18.
(a + b + c) / 3 fasst die gesamte Summe 25 zusammen, aber beide Operanden von / sind ganze Zahlen. Das Ergebnis ist 8. Bei (a + b + c) / 3.0 bleibt der Nachkommateil erhalten und das Ergebnis ist 8.333333333333334.
Die Typen der Operanden bestimmen die Berechnung. Zwei int-Operanden ergeben ein int-Ergebnis. Ein double-Operand bewirkt, dass der andere numerische Operand in double umgewandelt wird, wie bei 5 * 2.0 mit dem Ergebnis 10.0. Die aufnehmende Variable ändert nicht, wie zuvor gerechnet wurde.
Einen gespeicherten Wert ändern
int total = 10;
total += 5;
total *= 2;
total--;
Die gespeicherten Werte lauten nacheinander 10, 15, 30 und 29. Für diese int-Operanden führt total += 5; dieselbe Änderung aus wie total = total + 5;. Die Operatoren -=, /= und %= verbinden ebenso eine Operation mit einer Zuweisung. count++; erhöht eine Variable um 1 und count--; verringert sie um 1. Als einzelne Anweisungen verwendet, lassen sich ihre Auswirkungen leicht nachvollziehen.
Ein Ausdruck wie a + b ändert keinen der beiden Operanden. Um sein Ergebnis zu verwenden, weise es zu oder übergib es an einen Ausgabeaufruf: int sum = a + b; oder System.out.println(a + b);. Die allein stehende Zeile a + b; lässt sich nicht kompilieren, weil Java diesen arithmetischen Ausdruck nicht als eigenständige Anweisung zulässt. Zuweisungen, Inkremente, Dekremente und Methodenaufrufe können allein stehen und Auswirkungen haben.
Wichtige Erkenntnisse
- Schreibe Operatoren ausdrücklich:
*multipliziert und^berechnet keine Potenz. - Beachte zuerst die Rangfolge; rechne auf derselben arithmetischen Stufe von links nach rechts.
- Setze eine gesamte Summe in Klammern, bevor du sie zur Berechnung eines Mittelwerts dividierst.
- Die Typen der Operanden bestimmen die Rechenergebnisse, bevor die Zuweisung erfolgt.
- Eine zusammengesetzte Zuweisung speichert einen geänderten Wert; eigenständiges
++und--ändern ihn um 1.
3.2 Verwende Ganzzahldivision und Divisionsrest
Die Ganzzahldivision beantwortet, wie viele vollständige Gruppen hineinpassen. Der Divisionsrest zeigt, was übrig bleibt. Zusammen teilen diese Operationen eine Größe in nützliche Teile auf.
Quotient und Rest voraussagen
Sind beide Operanden ganze Zahlen, schneidet / den Nachkommateil ab und bewegt sich damit in Richtung null. 7 / 2 ist 3, 2 / 3 ist 0 und -7 / 2 ist −3. Dies ist Abschneiden, kein Runden auf die nächste ganze Zahl.
Der Restoperator % gibt zurück, was nach der Division übrig bleibt. 17 / 5 ergibt 3 und 17 % 5 ergibt 2. Drei Gruppen zu je 5 ergeben 15, sodass 2 übrig bleiben. Für ganzzahlige Operanden und einen Divisor ungleich null stellt (a / b) * b + a % b mit der Ganzzahlarithmetik von Java den Wert a wieder her.
Das Vorzeichen eines Divisionsrests ungleich null richtet sich nach dem linken Operanden: -7 % 3 ist −1, während 7 % -3 gleich 1 ist. Für nicht negative ganze Zahlen ist n % 2 bei geraden Werten 0 und bei ungeraden Werten 1.
Sekunden in größere Einheiten aufteilen
Beginne mit 3725 Sekunden:
int totalSeconds = 3725;
int hours = totalSeconds / 3600;
int secondsAfterHours = totalSeconds % 3600;
int minutes = secondsAfterHours / 60;
int seconds = secondsAfterHours % 60;
Die erste Division ergibt 1 volle Stunde. Der Rest beträgt 125 Sekunden. Die Division dieses Rests durch 60 ergibt 2 Minuten, wobei 5 Sekunden übrig bleiben. Das Ergebnis ist 1 h 2 min 5 s. Setzt du die Gesamtsumme wieder zusammen, erhältst du 3600 Sekunden plus 120 Sekunden plus 5 Sekunden, also 3725.
Verwende den Rest nach dem Abziehen der Stunden, um die Minuten innerhalb der aktuellen Stunde zu bestimmen. Eine Division der ursprünglichen Gesamtzahl durch 60 würde alle 62 vollen Minuten ergeben, einschließlich der bereits als Stunde gezählten Minuten.
Dieselben Operatoren extrahieren Dezimalziffern aus einer nicht negativen ganzen Zahl. 4827 % 10 ergibt die letzte Ziffer 7; 4827 / 10 ergibt die verbleibenden vorderen Ziffern 482.
Volle Gruppen und ausreichend Behälter unterscheiden
Für 50 Eier und Schachteln für jeweils 12 Eier ergibt 50 / 12 4 volle Schachteln und 50 % 12 2 übrige Eier. Um alle Eier unterzubringen, ist eine fünfte Schachtel nötig. Für nicht negative Anzahlen und positive Schachtelgrößen rundet der ganzzahlige Ausdruck (count + size - 1) / size die Anzahl der Behälter auf, sofern bei der Addition kein Überlauf auftritt. Für dieses Beispiel ergibt (50 + 12 - 1) / 12 den Wert 5.
Vor der Division für Nachkommateile sorgen
| Ausdruck | Gespeichertes oder berechnetes Ergebnis |
|---|---|
double result = 7 / 2; | 3.0 |
double result = 7 / 2.0; | 3.5 |
double result = (double) 7 / 2; | 3.5 |
Eine double-Zielvariable kann einen abgeschnittenen Nachkommateil nicht wiederherstellen. Mache vor der Division einen Operanden zu double, wenn du den Nachkommateil brauchst.
Division oder Restbildung durch die ganze Zahl null wirft während der Ausführung eine ArithmeticException. Gleitkommadivision verhält sich anders: 5.0 / 0 ergibt Infinity, -5.0 / 0 ergibt -Infinity und 0.0 / 0 ergibt NaN, was „keine Zahl“ bedeutet. Ein Ergebnis kann daher unbrauchbar sein, auch wenn die Ausführung nicht stoppt.
Wichtige Erkenntnisse
- Bei ganzen Zahlen schneidet
/in Richtung null ab;%gibt den Divisionsrest zurück. - Ein ganzzahliger Divisionsrest ungleich null hat das Vorzeichen des Dividenden.
- Verwende aufeinanderfolgende Quotienten und Reste, um Sekunden in Stunden, Minuten und Sekunden aufzuteilen.
- Volle Schachteln und die für alle Gegenstände benötigten Schachteln beantworten unterschiedliche Fragen.
- Mache vor der Division einen Operanden zu
double, damit der Nachkommateil erhalten bleibt. - Ganzzahldivision durch null wirft eine Ausnahme; Gleitkommadivision kann Unendlichkeit oder
NaNergeben.
3.3 Rechne mit Dezimalzahlen und der Math-Klasse
Dezimalrechnung ist für Messwerte und Mittelwerte nützlich. Die Klasse Math bietet fertige Berechnungen; durch Runden kannst du festlegen, wie du ein Ergebnis speicherst oder darstellst.
Nachkommateile erhalten und Näherungswerte erkennen
150 / 2.5 ergibt 60.0, die Geschwindigkeit in km/h bei einer Strecke von 150 km und einer Zeit von 2,5 Stunden. Da ein Operand vom Typ double ist, bleibt bei der Division ein Nachkommateil erhalten, wenn einer entsteht. Gewöhnliche double-Werte ohne Nachkommateil werden mit einer Nachkommastelle ausgegeben, etwa 60.0.
Ein double speichert viele Dezimalwerte als binäre Näherungswerte. Daher gibt 1.1 * 3 den Wert 3.3000000000000003 aus und 10.0 / 3 den Wert 3.3333333333333335. Rechne mit dem ungerundeten Wert weiter und runde ihn bei der Ausgabe.
Große oder kleine Werte können in wissenschaftlicher Schreibweise ausgegeben werden. 1.23456789E7 steht für 12.345.678,9 und 1.0E-4 für 0,0001. Für positive endliche Werte wird von 0,001 bis ausschließlich 10.000.000 die gewöhnliche Schreibweise verwendet. Die wissenschaftliche Schreibweise ändert die Darstellung, nicht den zugrunde liegenden Wert.
Nützliche Math-Methoden aufrufen
Math gehört zu java.lang, daher ist kein Import nötig.
| Aufruf | Ergebnis und Zweck |
|---|---|
Math.sqrt(16) | 4.0, eine Quadratwurzel |
Math.pow(2, 10) | 1024.0, eine Potenz |
Math.abs(-7) | 7, ein Betrag |
Math.max(3, 9) | 9, der größere Wert |
Math.min(3, 9) | 3, der kleinere Wert |
Math.sqrt und Math.pow geben double zurück. Die Konstante Math.PI beträgt ungefähr 3,141592653589793. Für einen Kreis mit dem Radius 2,5 cm ergibt Math.PI * 2.5 * 2.5 den Wert 19.634954084936208 cm², also etwa 19,63 cm². Für ein rechtwinkliges Dreieck mit Katheten von 3 cm und 4 cm addiert Math.sqrt(3 * 3 + 4 * 4) zuerst die quadrierten Katheten zu 25 und ergibt dann 5.0 cm.
Eine Rundungsrichtung wählen
| Aufruf | Ergebnis |
|---|---|
Math.round(2.4) | 2 |
Math.round(2.5) | 3 |
Math.round(-2.5) | -2 |
Math.floor(2.7) | 2.0 |
Math.ceil(2.1) | 3.0 |
Math.floor(-2.7) | -3.0 |
round wählt die nächste ganze Zahl; Werte genau in der Mitte werden in Richtung positiver Unendlichkeit gerundet. floor rundet in Richtung negativer Unendlichkeit ab; ceil rundet in Richtung positiver Unendlichkeit auf. Bei negativen Zahlen bedeutet „abwärts“ einen stärker negativen Wert, daher ergibt das Abrunden von −2,7 den Wert −3,0.
Für ein double-Argument gibt Math.round einen long zurück. Speichere das Ergebnis in einem long oder wandle es ausdrücklich um, wenn ein int passend ist: int rounded = (int) Math.round(2.7); speichert 3. floor und ceil geben double-Werte zurück.
Um einen gespeicherten Wert auf zwei Nachkommastellen zu runden, verwende Math.round(12.3456 * 100) / 100.0, was 12.35 ergibt. Durch das Multiplizieren liegen die Hundertstel an der Grenze zu den ganzen Zahlen. Die Division durch 100.0 skaliert mittels Gleitkommadivision zurück; eine Division durch die ganze Zahl 100 würde den Nachkommateil abschneiden und 12 ergeben. Muss nur der ausgegebene Text gerundet werden, kann printf den ursprünglichen Wert direkt formatieren.
Wichtige Erkenntnisse
- Ein
doubleerhält Nachkommateile in Ergebnissen, speichert aber viele Dezimalbrüche nur näherungsweise. Math.sqrt,Math.powundMath.PIermöglichen geometrische Berechnungen ohne Import.roundwählt die nächste ganze Zahl;floorundceilrunden in eine bestimmte Richtung.Math.round(double)gibtlongzurück, währendfloorundceildoublezurückgeben.- Verwende beim Zurückskalieren eines gerundeten Werts einen Dezimaldivisor, damit der Nachkommateil erhalten bleibt.
4Wandle Werte zwischen Datentypen um
Ein Wert kann zwischen numerischen Typen oder zwischen Zahlen und Text umgewandelt werden. Für jeden Weg gelten eigene Regeln: Manche numerischen Umwandlungen erfolgen automatisch, manche brauchen einen Cast, und Text mit Zahlen muss vor dem Rechnen geparst werden. Verfolge die Umwandlung genau an der Stelle, an der sie stattfindet. Eine Umwandlung nach einer Operation kann bereits verlorene Informationen nicht wiederherstellen; eine erfolgreiche Umwandlung kann dennoch einen großen Wert oder einen Wert mit Nachkommateil verändern.
4.1 Verwende erweiternde und explizite Typumwandlungen
Java wandelt einen numerischen Wert manchmal automatisch um. Andere Umwandlungen brauchen einen expliziten Cast. Ein Cast ändert den Typ eines Werts an einer bestimmten Stelle in einem Ausdruck, daher beeinflusst seine Position das Ergebnis.
Automatisch erweiternd umwandeln
Der wichtigste Pfad erweiternder numerischer Umwandlungen ist byte → short → int → long → float → double. Auch char wird erweiternd in int und weiter umgewandelt. Zum Beispiel speichert double d = 5; den Wert 5.0, und jeder int-Wert passt exakt in einen long.
Eine erweiternde Umwandlung in einen Gleitkommatyp kann Genauigkeit verlieren. Bei der Umwandlung von int zu float, von long zu float und von long zu double kann eine große ganze Zahl gerundet werden. Die Umwandlung eines int in einen double ist exakt. Zum Beispiel wird (float) 16777217 zu 1.6777216E7, was für 16.777.216 steht.
Eine einengende Typumwandlung mit Cast durchführen
Ein Cast schreibt den Zieltyp in Klammern vor den Wert:
int n = (int) 3.99;
Das gespeicherte Ergebnis ist 3. Ohne (int) weist Java die Zuweisung des double-Literals an einen int zurück. Bei der Umwandlung eines endlichen double-Werts innerhalb des Wertebereichs in eine ganze Zahl wird in Richtung null abgeschnitten: Auch (int) -3.99 ergibt −3. Abschneiden unterscheidet sich vom Runden; (int) Math.round(3.99) ergibt 4.
Einengende Typumwandlungen benötigen im Allgemeinen einen Cast. Eine nützliche Ausnahme erlaubt es, einen byte, short oder char mit einem passenden konstanten ganzzahligen Ausdruck zu initialisieren. Daher ist byte b = 100; ohne (byte) gültig. Für eine nicht konstante int-Variable gilt diese Ausnahme für die Zuweisung von Konstanten nicht allein deshalb, weil ihr aktueller Wert passt.
Den Cast vor die Operation setzen, die ihn braucht
Es gelten int sum = 25; und int count = 3;.
| Ausdruck | Was passiert | Ergebnis |
|---|---|---|
(double) sum / count | sum umwandeln, dann mit einem double dividieren. | 8.333333333333334 |
(double) (sum / count) | Ganze Zahlen dividieren, dann das ganzzahlige Ergebnis umwandeln. | 8.0 |
Ein Cast bindet stärker als Multiplikation und Division. Klammern bestimmen, ob er für einen Operanden oder eine abgeschlossene Berechnung gilt. Ein Cast nach einer Ganzzahldivision kann abgeschnittene Informationen nicht wiederherstellen.
Änderungen an Zeichen und kleinen ganzen Zahlen voraussagen
(int) 'A' ergibt den Zeichencode 65. Die Addition von 1 zu 'A' ergibt den int-Wert 66. Um das gesamte Ergebnis wieder in ein Zeichen umzuwandeln, schreibe (char) ('A' + 1); das ergibt 'B'. Ohne die äußeren Klammern um die Summe würde der Cast nur für 'A' gelten.
Bei einer einengenden Umwandlung zwischen ganzzahligen Typen bleiben nur die unteren Bits erhalten. (byte) 200 wird zu −56; (int) 3_000_000_000L wird zu −1294967296. Ein Cast erlaubt die Umwandlung, prüft aber nicht, ob der Ausgangswert passt.
Eine zusammengesetzte Zuweisung enthält eine Umwandlung in den Typ der linken Seite. Bei int x = 10; berechnet x += 2.7; den Wert 12,7 und engt ihn zu 12 ein. Die einfache Zuweisung x = x + 2.7; schlägt fehl, weil ihre rechte Seite vom Typ double ist.
Wichtige Erkenntnisse
- Erweiternde Typumwandlungen erfolgen automatisch, aber einige Umwandlungen in Gleitkommatypen können große ganze Zahlen runden.
- Eine einengende Typumwandlung braucht im Allgemeinen einen Cast; für die Zuweisung passender ganzzahliger Konstanten an kleine Typen gibt es eine Ausnahme.
- Ein Cast einer Dezimalzahl innerhalb des Wertebereichs in eine ganze Zahl schneidet in Richtung null ab.
- Wandle einen Operanden vor der Division mit einem Cast um, wenn der Nachkommateil erhalten bleiben soll.
- Einengende Umwandlungen zwischen ganzzahligen Typen können einen Wert ändern, indem sie höhere Bits verwerfen.
- Eine zusammengesetzte Zuweisung enthält die Rückumwandlung in den Typ der Variablen.
4.2 Wandle Text in Zahlen und Zahlen in Text um
Text kann Ziffern enthalten, ohne eine Zahl zu sein. Um mit eingegebenem oder gespeichertem Text zu rechnen, parse ihn in einen numerischen Typ. Um eine Nachricht zu erstellen, wandle einen numerischen Wert wieder in Text um.
Text vor dem Rechnen parsen
Der Ausdruck "42" + 1 ergibt „421“. Da der linke Operand ein String ist, führt + eine Konkatenation aus. Integer.parseInt("42") + 1 ergibt 43, weil das Parsen vor der Addition einen int liefert.
String first = "12";
String second = "30";
int total = Integer.parseInt(first) + Integer.parseInt(second);
Hier enthält total den Wert 42. Das Verbinden der ursprünglichen Strings würde „1230“ ergeben. Wähle die Umwandlung danach, wie der Wert verwendet werden soll, und nicht danach, ob seine Zeichen zufällig wie Zahlen aussehen.
Integer.parseInt(text) gibt einen int zurück; Long.parseLong(text) gibt einen long zurück. Integer.valueOf("42") gibt ein Integer-Objekt zurück, das Java automatisch in int umwandelt, wenn ein int benötigt wird. Für eine direkte Umwandlung von Text in int drückt parseInt das beabsichtigte Ergebnis klar aus.
Dezimalzahlen und Wahrheitswerte parsen
Double.parseDouble("3.75") gibt den double-Wert 3,75 zurück. Das Textformat verwendet auf jedem Computer unabhängig von den Regionseinstellungen einen Dezimalpunkt. Double.parseDouble("3,5") schlägt fehl. Auch Java-Quellcodeliterale verwenden einen Punkt, obwohl Methoden zum Einlesen über die Tastatur einem Gebietsschema folgen können.
Boolean.parseBoolean(text) folgt einer eigenen Regel: Die Methode gibt true für „true“ in beliebiger Groß- und Kleinschreibung zurück, etwa für „TRUE“. Jeder andere Text ergibt false, auch „yes“. Ein allgemeines bejahendes Wort wird nicht als wahr interpretiert.
Ungültigen Zahlentext erkennen
Ungültiger Zahlentext verursacht während der Programmausführung eine NumberFormatException. Integer.parseInt("4.5") schlägt fehl, weil Dezimaltext keine Darstellung einer ganzen Zahl ist. Auch Integer.parseInt("") und Integer.parseInt(" 42") schlagen fehl. Die Ausnahmemeldung nennt den Text, der nicht umgewandelt werden konnte.
Wie Leerraum behandelt wird, hängt von der Parsing-Methode ab. Double.parseDouble ignoriert Leerzeichen am Anfang und Ende, Integer.parseInt dagegen nicht. Wähle beim Einlesen von Nutzereingaben Testeingaben, die diese Unterschiede sichtbar machen.
Ein praktisches Eingabemuster liest eine ganze Zeile und parst sie:
int age = Integer.parseInt(scanner.nextLine());
double height = Double.parseDouble(scanner.nextLine());
Jeder Aufruf verbraucht seine gesamte Zeile einschließlich des Zeilenendes. Das hält Text- und Zahleneingaben einheitlich und vermeidet, Token und ganze Zeilen gemischt einzulesen.
Eine Zahl in Text umwandeln
String.valueOf(42), Integer.toString(42) und "" + 42 ergeben alle den String „42“. Double.toString(2.50) ergibt „2.5“. Die ursprüngliche Dezimalschreibweise bleibt nicht an der gespeicherten Zahl haften, daher fügt diese Umwandlung keine abschließende Null hinzu, um sie zu erhalten.
Verwende String.format, wenn du gespeicherten Text mit einer festen Anzahl von Nachkommastellen brauchst. Verwende printf, wenn du den formatierten Text direkt ausgeben möchtest. Weder ein numerischer Cast noch eine einfache Konkatenation sorgt für eine feste Anzeige mit zwei Nachkommastellen.
Wichtige Erkenntnisse
- Text, der wie eine Zahl aussieht, bleibt ein String, bis er geparst wird.
Integer.parseIntundDouble.parseDoubleerzeugen numerische Werte zum Rechnen.Double.parseDoubleverwendet unabhängig vom Gebietsschema einen Dezimalpunkt.- Ungültiger Zahlentext verursacht eine
NumberFormatException; das Parsen ganzer Zahlen weist umgebende Leerzeichen zurück. Boolean.parseBooleanakzeptiert „true“ in beliebiger Groß- und Kleinschreibung und gibt für anderen Text false zurück.- Die einfache Umwandlung von Zahlen in Text erhält zusätzliche abschließende Nullen nicht.
5Lies Eingaben ein und entwickle vollständige Programme
Eingabe und Ausgabe machen aus einer Berechnung ein nutzbares Programm. Ordne jeder Eingabeaufforderung einen passenden Scanner-Aufruf zu, lege fest, wie Dezimalzahlen eingegeben werden, und wähle klare Ausgabebeschriftungen und Zahlenformate. Entwickle ein vollständiges Programm anhand eines Eingabe-Verarbeitung-Ausgabe-Plans und teste es anschließend mit von Hand berechneten Ergebnissen. Ein Programm kann erfolgreich kompiliert werden und zu Ende laufen, obwohl es die falsche Zeile einliest oder den falschen Wert anzeigt.
5.1 Lies Eingaben mit Scanner ein
Tastatureingaben kommen als Text an. Ein Scanner kann eine ganze Zeile, ein einzelnes Wort oder ein in eine Zahl umgewandeltes Wort einlesen. Entscheide dich für eine einheitliche Vorgehensweise, bevor du Eingaben abfragst.
Einen Scanner erstellen und eine Zeile einlesen
import java.util.Scanner;
public class Greeting {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("What is your name? ");
String name = scanner.nextLine();
System.out.println("Hello, " + name + "!");
}
}
Der Import steht vor der Klasse. Die Anweisung zum Erstellen steht innerhalb von main und verbindet den Scanner mit System.in. Ein Scanner reicht für dieses Programm. nextLine() wartet auf die eingegebene Zeile und gibt ihren Text ohne Zeilenumbruch zurück. Die Eingabe „Ada“ führt dazu, dass die letzte Anweisung „Hello, Ada!“ ausgibt. Durch print bei der Eingabeaufforderung steht die Eingabe neben der Frage.
Zwischen Zeilen und Token wählen
| Methode | Was sie liest |
|---|---|
nextLine() | Den Rest der aktuellen Zeile ohne das Zeilenende |
next() | Das nächste durch Leerraum getrennte Token als Text |
nextInt() | Das nächste Token als int |
nextLong() | Das nächste Token als long |
nextDouble() | Das nächste Token als double |
nextBoolean() | Das nächste Token als Wahrheitswert |
Bei „Ada Lovelace“ gibt next() „Ada“ zurück. Ein anschließendes nextLine() gibt „ Lovelace“ einschließlich des führenden Leerzeichens zurück. Zwei nextInt()-Aufrufe können „3 4“ aus einer Zeile einlesen. Ein Zahlentoken, das nicht zur Methode passt, etwa „4.5“ oder „abc“ für nextInt(), verursacht eine InputMismatchException.
Das ungelesene Zeilenende berücksichtigen
Angenommen, die nutzende Person gibt „30“ ein, drückt die Eingabetaste, gibt dann „Ada Lovelace“ ein und drückt erneut die Eingabetaste. Dieser Code liest den Namen nicht wie beabsichtigt ein:
int age = scanner.nextInt();
String name = scanner.nextLine();
nextInt() verbraucht 30, lässt aber das Zeilenende stehen. nextLine() verbraucht sofort den leeren Rest derselben Zeile, sodass name gleich "" ist. Füge scanner.nextLine(); zwischen den beiden Anweisungen ein, um diesen Rest zu verwerfen, bevor der Name in der nächsten Zeile eingelesen wird.
Eine andere Lösung besteht darin, jede Antwort mit nextLine() einzulesen und Zahlenzeilen zu parsen: int age = Integer.parseInt(scanner.nextLine());. So vermeidest du den Wechsel zwischen zwei verschiedenen Eingabeeinheiten.
Die Dezimalkonvention klären
nextDouble() folgt dem Gebietsschema des Scanners, anfangs dem Standardgebietsschema des Computers für die Formatierung. Ein Gebietsschema mit Dezimalkomma akzeptiert in diesem Beispiel „3,5“ als Dezimalzahl und weist „3.5“ zurück. Um Dezimalzahlen einheitlich mit Punkt einzulesen, ergänze import java.util.Locale; und erstelle:
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
Auch das Einlesen einer ganzen Zeile mit Double.parseDouble(scanner.nextLine()) verwendet einen Punkt. Eine Änderung des Scanner-Gebietsschemas ändert weder Java-Quellcodeliterale noch das Gebietsschema späterer printf-Aufrufe.
Lies Werte in der Reihenfolge ein, in der die Eingabeaufforderungen danach fragen. Fragst du nach einem Namen und dann nach einem Alter, muss der erste Leseaufruf den Namen speichern. Ein falsch platzierter Leseaufruf kann Daten in die falsche Variable schreiben oder einen Umwandlungsfehler auslösen.
Wichtige Erkenntnisse
- Importiere
java.util.Scannervor der Klasse und erstelle einen Scanner innerhalb vonmain. nextLine()liest den Rest einer Zeile; Tokenmethoden lesen durch Leerraum getrennte Werte.- Ein Zahlentoken der falschen Art verursacht eine
InputMismatchException. - Lies nach einem numerischen Token den Rest der Zeile ein, bevor du Text in der nächsten Zeile liest.
useLocale(Locale.US)legt für Scanner-Eingaben den Dezimalpunkt fest; das Parsen ganzer Zeilen ist eine weitere einheitliche Vorgehensweise.- Stimme das Einlesen auf die Reihenfolge der Eingabeaufforderungen ab.
5.2 Formatiere Ausgaben mit printf
Formatierte Ausgabe steuert, wie Werte innerhalb einer Nachricht erscheinen. printf kann eine feste Anzahl von Nachkommastellen anzeigen, einen Zeilenumbruch hinzufügen und Werte in Spalten ausrichten, ohne ihre gespeicherten Werte zu ändern.
Platzhalter und Werte aufeinander abstimmen
Ein Formatstring enthält gewöhnlichen Text sowie Spezifizierer, die mit % beginnen. Jeder Spezifizierer, der einen Wert benötigt, nimmt den nächsten Wert nach dem Formatstring:
System.out.printf("%s is %d years old%n", "Ada", 36);
Dies gibt „Ada is 36 years old“ aus und beginnt eine neue Zeile. %s zeigt Text oder einen anderen Wert als Text an, %d eine ganze Zahl wie einen int oder long und %f einen Gleitkommawert. %n fügt einen Zeilenumbruch ein, ohne einen Wert zu verbrauchen. %% gibt ein Prozentzeichen aus.
printf fügt nicht automatisch einen Zeilenumbruch hinzu. Nimm %n auf, wenn die nächste Ausgabe in einer neuen Zeile beginnen soll. Auch die gewöhnliche Escape-Sequenz \n steht innerhalb von Java-Text für ein Zeilenumbruchzeichen; %n ist das plattformspezifische Zeilentrennzeichen des Formatierers.
Nachkommastellen für die Anzeige festlegen
Das einfache %f gibt sechs Stellen nach dem Dezimaltrennzeichen aus: Die Formatierung von 2.5 ergibt „2.500000“. Die Genauigkeitsangabe in %.2f fordert zwei Stellen an:
System.out.printf("Total: %.2f%n", 12.3456);
Bei US-Formatierung lautet die Ausgabe „Total: 12.35“. Der Wert wird im angezeigten Text gerundet. Eine Variable mit dem Wert 12,3456 enthält nach der Ausgabe weiterhin diesen Rechenwert.
Bei System.out.printf("%d items at %.2f each, total %.2f%n", 3, 1.5, 3 * 1.5); füllen die Werte die drei Platzhalter der Reihe nach. Bei US-Einstellungen lautet die Ausgabe „3 items at 1.50 each, total 4.50“.
Felder mit einer Breite ausrichten
Eine Feldbreite ist eine Mindestgröße. %5d richtet eine ganze Zahl innerhalb von mindestens fünf Zeichen rechtsbündig aus; %-6s richtet Text innerhalb von mindestens sechs Zeichen linksbündig aus. %6.1f kombiniert die Feldbreite 6 mit einer Nachkommastelle.
System.out.printf("[%5d][%-6s][%6.1f]%n", 42, "Ada", 9.25);
Bei US-Einstellungen lautet die genaue Ausgabe [ 42][Ada ][ 9.3]. Die eckigen Klammern machen die Auffüllung sichtbar. Ein Wert, der länger als seine Feldbreite ist, wird dennoch vollständig ausgegeben; die Feldbreite schneidet keine Zeichen ab.
Ein nicht passender Spezifizierer verursacht einen Laufzeitfehler. printf("%d%n", 2.5) lässt sich kompilieren, wirft aber eine IllegalFormatConversionException, weil %d eine ganze Zahl erwartet. Zu wenige übergebene Werte wie in printf("%d %d%n", 2) verursachen eine MissingFormatArgumentException.
Zwischen Ausgabe und gespeichertem Text wählen
String.format wendet dieselben Formatierungsregeln an, gibt aber einen String zurück:
String line = String.format("%.1f km", 12.345);
Bei US-Einstellungen enthält line den Wert „12.3 km“; diese Anweisung hat nichts ausgegeben.
Beide Formatierungsmethoden verwenden das Standardgebietsschema, sofern du keines übergibst. Ergänze import java.util.Locale; und verwende dann System.out.printf(Locale.US, "%.2f%n", 12.3456);, um „12.35“ statt des bei einem Gebietsschema mit Dezimalkomma üblichen „12,35“ sicherzustellen. Auch String.format kann Locale.US als erstes Argument erhalten. Die Ausgabe eines double mit println verwendet unabhängig vom Formatierungsgebietsschema einen Punkt.
Wichtige Erkenntnisse
- Ordne jedem Spezifizierer, der einen Wert benötigt, den nächsten Wert eines passenden Typs zu.
- Verwende
%nfür einen Zeilenumbruch und%%für ein auszugebendes Prozentzeichen. %.2frundet den angezeigten Text auf zwei Stellen, ohne den gespeicherten Wert zu ändern.- Die Feldbreite füllt ein Feld auf eine Mindestgröße auf; längere Werte werden nicht abgeschnitten.
String.formatgibt Text zurück, währendprintfihn ausgibt.- Übergib ein Gebietsschema, um das Dezimaltrennzeichen in der formatierten Ausgabe zu steuern.
5.3 Verbinde Eingabe, Verarbeitung und Ausgabe
Ein vollständiges Berechnungsprogramm verbindet drei Phasen: Eingaben einlesen, damit rechnen und Ergebnisse ausgeben. Planst du vor dem Tippen die Werte und ihre Einheiten, kannst du leichter Datentypen wählen und das Ergebnis testen.
Ein Fahrzeitprogramm planen
Die Eingaben sind die Strecke in Kilometern und die Durchschnittsgeschwindigkeit in km/h. Strecke geteilt durch Geschwindigkeit ergibt die Zeit in Stunden. Beide Messwerte brauchen double, damit bei der Division ein Nachkommateil erhalten bleiben kann. Die Ausgabe erfolgt in ganzen Stunden und Minuten, gerundet auf die nächste Minute.
import java.util.Scanner;
public class TravelTime {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Distance (km): ");
double distance = Double.parseDouble(scanner.nextLine());
System.out.print("Speed (km/h): ");
double speed = Double.parseDouble(scanner.nextLine());
int totalMinutes = (int) Math.round(distance / speed * 60);
int hours = totalMinutes / 60;
int minutes = totalMinutes % 60;
System.out.println("Travel time: " + hours + " h " + minutes + " min");
}
}
Für 150 km bei 80 km/h ergibt die Division 1,875 Stunden. Die Multiplikation mit 60 ergibt 112,5 Minuten. Math.round gibt den long-Wert 113 zurück, und der Cast wandelt ihn in int um. Ganzzahldivision und Divisionsrest ergeben dann 1 Stunde und 53 Minuten. Die Ausgabe lautet „Travel time: 1 h 53 min“.
Wären Strecke und Geschwindigkeit beide vom Typ int, würde 150 / 80 * 60 den Wert 60 ergeben. Der Nachkommateil verschwindet bei der Division, noch vor der Multiplikation. Die Wahl der Datentypen gehört in den Plan und nicht nur in die abschließende Ausgabeanweisung.
Anzeige und Berechnung getrennt wählen
Für eine Gesamtrechnung von 87,60, die auf 4 Personen aufgeteilt wird, speichere die Summe in double und die Anzahl in int. double share = total / people; ergibt 21,9. Bei US-Formatierung gibt System.out.printf("Each person pays %.2f%n", share); „Each person pays 21.90“ aus. Die Formatierung liefert die zweite Nachkommastelle, ohne die Berechnung zu ändern.
Für die ganzzahligen Punktzahlen 7, 8 und 10 ergibt double average = (a + b + c) / 3.0; den Wert 8.333333333333334, der mit %.2f als „8.33“ angezeigt wird. Die Klammern fassen die Summe zusammen und der Dezimaldivisor erhält den Nachkommateil.
Mit bekannten Ergebnissen testen
Berechne erwartete Ergebnisse, bevor du das Programm ausführst. Für die Fahrzeit sollten 120 km bei 60 km/h die Ausgabe 2 h 0 min ergeben. Eine Strecke von 0 km bei positiver Geschwindigkeit sollte 0 h 0 min ergeben. Probiere Eingaben nahe einer Rundungsgrenze und größere gültige Strecken aus, um mehr als nur die einfachste Berechnung zu prüfen.
Beziehe null, negative und große Eingaben ein, wenn du das Verhalten des Programms prüfst. Entscheide, ob jede Eingabe für die Aufgabe sinnvoll ist. Eine Anzahl von null Personen führt bei total / people zu Infinity, wenn total ein double-Wert ungleich null ist; Ganzzahldivision durch null wirft eine ArithmeticException. Eine erfolgreiche Ausführung allein belegt noch kein brauchbares Ergebnis.
Weicht die Ausgabe von deiner Erwartung ab, gib Zwischenwerte aus oder verfolge sie in einer Tabelle. Suche den ersten falschen Wert, korrigiere die verantwortliche Anweisung und führe die bekannten Tests erneut aus. Vergleiche neben Zahlen auch Leerzeichen und Beschriftungen.
Verwende Namen wie totalMinutes, benannte Konstanten wie MINUTES_PER_HOUR, Einheiten in Eingabeaufforderungen und kurze Kommentare, die den Zweck einer Berechnung erklären.
Wichtige Erkenntnisse
- Liste Eingaben, Ausgaben, Formeln, Einheiten und Datentypen auf, bevor du ein Berechnungsprogramm schreibst.
- Erhalte Nachkommateile von Messwerten während der Berechnung und runde dann, wenn die Ausgabe ganze Einheiten verlangt.
- Teste gewöhnliche Eingaben, Eingaben an Grenzen und ungeeignete Eingaben anhand des erwarteten Verhaltens.
- Verfolge Zwischenwerte, um den ersten fehlerhaften Schritt zu finden.
- Klare Namen, Konstanten und Einheiten machen ein Programm leichter überprüfbar.
Java-Programme kompilieren und starten: Beispiele
1Erstelle und starte ein kleines Programm zur Textausgabe
13 Schritte
- 1EinführungVerfolge Anweisungen ab main
Ein Java-Programm braucht einen Einstiegspunkt und eine Folge von Anweisungen. In der klassischen Form enthält eine Klasse
main, undmainenthält die Anweisungen, die ausgeführt werden.Du erstellst einen kurzen Hinweis, startest das Programm und verfolgst die Ausgabeposition über mehrere Ausgabeaufrufe hinweg. Dieselbe Reihenfolge hilft bei der Fehlersuche: Prüfe zuerst, ob der Quellcode kompiliert wird, dann, ob das Programm läuft, und schließlich, ob seine Ausgabe dem beabsichtigten Hinweis entspricht.
- 2BeispielPlatziere den Hinweis in der Methode
Beginne mit dieser vollständigen Struktur:
public class Notice { public static void main(String[] args) { System.out.println("Studio open"); } }Die äußeren Klammern schließen die Klasse ein; das innere Paar schließt die Methode ein. Java beginnt mit der Ausgabeanweisung innerhalb von
main. Ihr Semikolon beendet die Anweisung, während die schließenden Klammern die beiden umgebenden Rümpfe beenden. - 3TippPrüfe Namen, bevor du weiteren Code ergänzt
Speichere die öffentliche Klasse
NoticeinNotice.java. Achte genau auf das großeN. Behalte auchSystemund den kleingeschriebenen Methodennamenmainbei: Java behandelt unterschiedliche Groß- und Kleinschreibung als unterschiedliche Namen.Rücke jeden verschachtelten Rumpf um vier Leerzeichen ein, damit eine falsch platzierte Klammer leicht zu erkennen ist. Ein kurzer
//-Kommentar kann den Grund für einen Schritt erklären, ohne eine ausführbare Anweisung zu werden. - 4HerausforderungKorrigiere die Einstiegsmethode
Eine Datei deklariert korrekt
public class Bulletin, ihre einzige Methode lautet aberpublic static void Main(String[] args). Sie wird kompiliert und der Programmstarter findet die main-Methode nicht. Welche Änderung ist nötig?---reveal---
Ändere
Maininmain. Der großgeschriebene Name deklariert eine andere Methode und stellt daher nicht den beabsichtigten Einstiegspunkt bereit. Die Datei muss außerdem weiterhinBulletin.javaheißen, passend zu ihrer öffentlichen Klasse. - 5ErklärungKompiliere und starte das Hinweisprogramm
Gib im Quellordner ein:
javac Notice.java java Noticejavacprüft den Quellcode und erzeugt den BytecodeNotice.class.javastartet die JVM, um diese Klasse auszuführen. Ein JDK stellt beide Befehle bereit; eine IDE führt diese Schritte über ihre Startschaltfläche aus. Lass im Startbefehl für die kompilierte Klasse die Endung.classweg.java Notice.javaist eine gesonderte Startform für Quelldateien, die seit Java 11 verfügbar ist. - 6HerausforderungLies zuerst den ersten Fehler
Nachdem eine lernende Person das schließende Anführungszeichen einer Nachricht gelöscht hat, sieht sie mehrere Compilermeldungen zu dieser und späteren Zeilen. Sollte jede spätere Anweisung sofort neu geschrieben werden? Erkläre den nächsten Schritt.
---reveal---
Behebe den ersten Fehler, indem du das Stringliteral schließt, speichere und kompiliere erneut. Ein nicht geschlossenes Anführungszeichen kann dazu führen, dass späterer Code fehlerhaft erscheint. Das erneute Kompilieren zeigt, ob die späteren Meldungen verschwinden, bevor weitere Änderungen nötig sind.
- 7BeispielVerfolge die ersten beiden Ausgabeaufrufe
Ersetze die ursprüngliche Nachricht durch:
System.out.print("Studio "); System.out.print(3);Der erste Aufruf gibt das Wort und das folgende Leerzeichen aus. Da
printkeinen Zeilenumbruch hinzufügt, setzt der zweite Aufruf3unmittelbar hinter dieses Leerzeichen. Die bisherige Ausgabe lautet „Studio 3“, und der nächste Aufruf würde weiterhin in dieser Zeile fortfahren. Ausgabeaufrufe fügen selbst keine zusätzlichen Trennzeichen ein. - 8BeispielBeende eine Zeile und beginne eine neue
Setze dasselbe Programm fort mit:
System.out.println(" open"); System.out.println("Welcome");Der erste Aufruf fügt sein führendes Leerzeichen und das Wort „open“ an die bestehende Zeile an und beendet sie dann. Der zweite gibt „Welcome“ aus und beendet die nächste Zeile. Der vollständige Text lautet:
Studio 3 open WelcomeZwischen den Meldungen steht keine Leerzeile; ein leeres
println()würde eine hinzufügen. - 9KernaussageAnführungszeichen und Escape-Sequenzen bestimmen den Text
Anführungszeichen entscheiden, ob Java wörtlichen Text ausgibt oder Code auswertet.
println("3 + 4")gibt „3 + 4“ aus;println(3 + 4)gibt 7 aus.Um ein Anführungszeichen in ein Literal aufzunehmen, schreibe
\". Für eine neue Zeile innerhalb eines Literals schreibe\n; ein Tabulator ist\tund ein umgekehrter Schrägstrich ist\\. Die Escape-Sequenzen werden zu Zeichen im entstehenden Text. Ein gewöhnliches Literal selbst muss in einer Quellcodezeile geöffnet und geschlossen werden. - 10HerausforderungSage die Zeilengrenzen voraus
Was gibt dieser Code aus?
System.out.print("A"); System.out.println("B"); System.out.println(); System.out.print("C");---reveal---
Die erste Zeile lautet „AB“, die zweite Zeile ist leer und die dritte enthält „C“. Der erste Aufruf bleibt in seiner Zeile, der nächste beendet sie und das leere
println()fügt einen weiteren Zeilenumbruch hinzu. Zwischen A und B erscheinen keine Leerzeichen, weil keine Anweisung eines ausgibt. - 11VerbindungBestimme die Phase des Fehlers
Angenommen, ein geändertes Hinweisprogramm wird kompiliert, startet und stoppt dann bei einer Ganzzahldivision durch null. Das ist ein Laufzeitfehler, der durch eine Ausnahme gemeldet wird. Läuft es zu Ende, beschriftet aber einen Raum mit der falschen Nummer, ist das ein Logikfehler.
Die Kompilierung prüft die Regeln von Java; sie weiß nicht, welchen Raum du gemeint hast. Erstelle den erwarteten Hinweis vor dem Testen und vergleiche jede Beschriftung, jeden Wert, jedes Leerzeichen und jeden Zeilenumbruch.
- 12HerausforderungUnterscheide zwei Korrekturen
Ein Programm lässt sich zunächst nicht kompilieren, weil einer Ausgabeanweisung das Semikolon fehlt. Nach dieser Korrektur läuft es, gibt aber zwei Meldungen in einer Zeile aus, obwohl zwei Zeilen verlangt sind. Was muss in jeder Phase geändert werden?
---reveal---
Ergänze das Semikolon, um den Kompilierfehler zu beheben. Ändere dann bei der ersten Nachricht
printinprintlnoder gib dort einen Zeilenumbruch aus, um die Ausgabelogik zu korrigieren. Prüfe die zweite Änderung, indem du die tatsächliche Zeilenaufteilung mit der erwarteten vergleichst. - 13ZusammenfassungPrüfe Struktur, Ausführung und Ausgabe
Nutze die Struktur aus Klasse und
main, um die ausführbaren Anweisungen zu finden. Stimme den Namen der öffentlichen Klasse mit der Quelldatei ab und kompiliere und starte dann mit den passenden Befehlen.Verfolge bei Ausgabeaufrufen die aktuelle Ausgabeposition:
printbleibt in der Zeile,printlnwechselt weiter. Ist ein Ergebnis falsch, bestimme, ob die Kompilierung fehlschlug, die Ausführung stoppte oder die fertige Ausgabe von deiner Erwartung abweicht. Jeder Fall weist auf eine andere Prüfung hin.
2Verfolge gespeicherte Werte und erstelle eine Nachricht
12 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungVerfolge Werte, bevor du die Ausgabe vorhersagst
- 2BeispielErstelle zwei unabhängig gespeicherte Werte
- 3BeispielÄndere nur die benannte Zielvariable
- 4HerausforderungSichere einen Wert beim Vertauschen
- 5TippVerwende final und var bewusst
- 6ErklärungWähle einen Datentyp, der zu den Daten passt
- 7BeispielLass die Schreibweise des Literals den Typ bestimmen
- 8HerausforderungWandle vor der Multiplikation erweiternd um
- 9BeispielErstelle eine Nachricht aus dem Ablauf
- 10HerausforderungBestimme, wann Plus Addition bedeutet
- 11HerausforderungVerbinde einen kopierten Wert mit einer neuen Ausgabe
- 12ZusammenfassungVerwende den aktuellen Wert und den tatsächlichen Typ
3Teile eine Dauer auf und rechne mit Nachkommateilen
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungWähle die zur Frage passende Operation
- 2ErklärungFasse eine vollständige Berechnung zusammen
- 3HerausforderungKorrigiere einen Ausdruck für den Mittelwert
- 4BeispielZähle vollständige Stunden
- 5BeispielBehalte die Sekunden nach diesen Stunden
- 6BeispielBestimme Minuten und Sekunden
- 7HerausforderungTeile eine andere Dauer auf
- 8KernaussageAbschneiden erfolgt in Richtung null
- 9BeispielErhalte den Nachkommateil eines Messwerts
- 10ErklärungVerwende Math für eine Wurzel oder Potenz
- 11HerausforderungWähle die Rundungsregel
- 12TippSkaliere mit einem Dezimaldivisor zurück
- 13HerausforderungErhalte einen Mittelwert vor dem Runden
- 14ZusammenfassungVerfolge bei jeder Operation Typ und Gruppierung
4Wandle Werte an der richtigen Stelle um
11 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungFrag dich, welcher Wert die Umwandlung erreicht
- 2ErklärungWandle einen numerischen Wert automatisch erweiternd um
- 3BeispielVergleiche zwei Cast-Positionen
- 4HerausforderungWandle einen negativen Wert um und runde ihn
- 5TippBehandle einen Cast nicht als Wertebereichsprüfung
- 6BeispielParse vor dem Addieren
- 7ErklärungStimme die Parsing-Methode auf den Text ab
- 8HerausforderungSage Parsing-Ergebnisse voraus
- 9VerbindungBereite Text für die Anzeige vor
- 10HerausforderungVerfolge die gesamte Umwandlungskette
- 11ZusammenfassungWähle eine Umwandlung passend zu ihrer Aufgabe
5Lies ein, berechne, formatiere und teste
16 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungBaue ein Programm um seine Daten auf
- 2ErklärungVerbinde einen Scanner mit der Tastatureingabe
- 3BeispielLies eine Bezeichnung als ganze Zeile ein
- 4BeispielParse Zahlenzeilen einheitlich
- 5HerausforderungKorrigiere eine übersprungene Bezeichnung
- 6TippLege Konventionen für Zahleneingaben ausdrücklich fest
- 7BeispielRechne mit den vorgesehenen Typen
- 8ErklärungStimme den Formatstring auf die Werte ab
- 9BeispielGib einen gerundeten Messwert aus
- 10HerausforderungKorrigiere den Spezifizierer
- 11BeispielSpeichere formatierten Text oder richte ihn aus
- 12ErklärungWähle Tests vor der Ausführung
- 13HerausforderungFinde einen Rechenfehler mit einem Test
- 14TippVerfolge den ersten unerwarteten Wert
- 15HerausforderungÜbertrage den Plan auf eine Geschwindigkeit
- 16ZusammenfassungPrüfe den gesamten Weg von der Eingabe zum Text
Java-Programme kompilieren und starten: Übungsaufgaben
Set 1: Lies deinen ersten Java-Code und vollziehe seinen Ablauf nach10 Übungsfragen
Frage 1 von 10
public class TrailLog. Wie muss seine Quelldatei heißen?Antwort zeigenAntwort ausblenden
.java. TrailLog.java behält beide Großbuchstaben in TrailLog bei. Die Endung .class gehört zu kompiliertem Bytecode. Die Quelldatei TrailLog.class zu nennen, verwechselt daher die Eingabedatei mit der Ausgabe des Compilers.Frage 2 von 10
javac Desk.java ist erfolgreich. Welcher Terminalbefehl startet die kompilierte Klasse?Antwort zeigenAntwort ausblenden
java Desk. Mit .class wird die Klasse dem Programmstarter nicht korrekt bezeichnet. javac kompiliert Quellcode, führt das Programm aber nicht aus; die Groß- und Kleinschreibung des Klassennamens muss erhalten bleiben.Frage 3 von 10
Welcher Text wird genau ausgegeben, wenn / für einen Zeilenumbruch steht?
System.out.print("Gate ");
System.out.println(4);
System.out.print("Open");
Antwort zeigenAntwort ausblenden
print("Gate ") lässt die Ausgabeposition hinter dem Leerzeichen stehen, sodass println(4) die erste Zeile zu „Gate 4“ ergänzt und dann einen Zeilenumbruch hinzufügt. Der letzte Aufruf gibt „Open“ in der nächsten Zeile aus. Wer alles zu „Gate 4Open“ verbindet, übersieht den von println erzeugten Zeilenumbruch.Frage 4 von 10
Welchen Wert enthält saved nach diesen Anweisungen?
int stock = 8;
int saved = stock;
stock = stock + 6;
Antwort zeigenAntwort ausblenden
stock nach saved. Die spätere Änderung von stock ändert nur stock, sodass saved bei 8 bleibt. Wer 14 erwartet, behandelt die Zuweisung als dauerhafte Verbindung zwischen den Variablen; Java hat aber zu einem Zeitpunkt einen Wert kopiert.Frage 5 von 10
4.25 in Java zu einem float-Literal?Antwort zeigenAntwort ausblenden
f gibt dem Literal den Typ float, wie in 4.25f. Ohne Suffix hat ein Dezimalliteral wie 4.25 den Typ double, selbst wenn der Wert in einen float passen würde. L kennzeichnet ein ganzzahliges long-Literal und kann diese Dezimalzahl nicht zu einem float machen.Frage 6 von 10
System.out.println("Seats: " + 6 + 2); aus?Antwort zeigenAntwort ausblenden
6 + 2 nötig, damit die Zahlen vor der Konkatenation addiert werden.Frage 7 von 10
int result = 18 - 6 / 3 * 2; zugewiesen?Antwort zeigenAntwort ausblenden
6 / 3 ergibt 2, die Multiplikation mit 2 ergibt 4 und deren Subtraktion von 18 ergibt 14. Wer 16 erhält, behandelt 3 * 2 als Divisor, obwohl keine Klammern diesen Ausdruck zusammenfassen.Frage 8 von 10
-11 / 4?Antwort zeigenAntwort ausblenden
Frage 9 von 10
int total = 19; int groups = 4; einen Quotienten mit Nachkommateil?Antwort zeigenAntwort ausblenden
total vor der Division macht einen Operanden zu double, sodass die Division 4,75 ergibt. Ein Cast des bereits berechneten Ausdrucks total / groups ergibt nur 4,0, weil die Ganzzahldivision den Nachkommateil abgeschnitten hat. Ein Cast des endgültigen Dezimalergebnisses zu int würde diesen Nachkommateil ebenfalls verlieren.Frage 10 von 10
Ein Scanner erhält „27“, Eingabetaste, „Mina Chen“, Eingabetaste. Was gibt dieser Code aus?
int age = scanner.nextInt();
scanner.nextLine();
String first = scanner.next();
String rest = scanner.nextLine();
System.out.println(age + ":" + first + ":" + rest);
Antwort zeigenAntwort ausblenden
nextLine() verbraucht den leeren Rest nach 27. next() liest dann „Mina“, und das abschließende Einlesen der Zeile behält das führende Leerzeichen vor „Chen“, sodass „27:Mina: Chen“ entsteht. Wer dieses Leerzeichen in der Vorhersage weglässt, behandelt nextLine() fälschlich wie das Einlesen eines Tokens, bei dem Leerraum übersprungen wird.Set 2: Wähle Datentypen und verbinde Eingabe und Ausgabe10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
double average = 19 / 4; den Wert 4.0 aus. Welche Fehlerart erklärt den ungenauen Mittelwert?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Welche Werte haben left und right nach diesem Tauschversuch?
int left = 2;
int right = 7;
left = right;
right = left;
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Math.floor(-4.2) zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
String quantity = "16"; Welcher Ausdruck erzeugt aus diesem Text die ganze Zahl 21?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
System.out.printf("Mass: %.2f kg%n", 6.375); bei US-Formatierung vor dem Zeilenumbruch aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
int km = 45; int minutes = 50; double speed = km / minutes * 60;. Es gibt null aus. Welcher Ersatz berechnet die Geschwindigkeit in km/h und erhält dabei die Eingaben?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Verfolge Berechnungen und formatierte Ergebnisse10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Path: C:\Work mit genau einem umgekehrten Schrägstrich aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
System.out.println(3 + 4 + " / " + 3 * 4); aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Welcher Wert wird ausgegeben?
int value = 20;
value -= 3 * 2;
value /= 4;
System.out.println(value);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
double value = Math.round(8.276 * 100) / 100; gespeichert?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
(int) -6.8?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Integer.parseInt(" 58")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Die Eingabe lautet „Lina Park“, gefolgt von der Eingabetaste. Welchen String erhält rest?
String first = scanner.next();
String rest = scanner.nextLine();
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
System.out.printf("[%4d][%-5s]", 7, "Oak"); genau ausgegeben?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
int seconds = 7_489;. Welches Ausdruckspaar ergibt die vollen Stunden und die verbleibenden ganzen Minuten innerhalb der aktuellen Stunde?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Finde den ersten fehlerhaften Schritt10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
System.out.println("Ready")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
var count = 6;, wenn dieselbe Methode count = 6.5; ausführt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
int edge = 70_000; long area = edge * edge;. Die gespeicherte Fläche ist falsch. Welcher Ersatz berechnet das exakte ganzzahlige Produkt, während edge ein int bleibt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Was gibt dieser Code aus?
int width = 12;
int height = 7;
int total = 2 * (width + height);
total -= 5;
double part = total / 4;
System.out.println(part);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Math.sqrt(5 * 5 + 12 * 12) zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Was wird ausgegeben?
int value = 9;
value += 2.8;
double result = value / 4;
System.out.println(result);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Boolean.parseBoolean("Yes") zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
minutes = totalSeconds / 60; seconds = totalSeconds;. Welche Korrektur behebt die Berechnung?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Locale.US und liest zwei Zeilen mit double mass = scanner.nextDouble(); String label = scanner.nextLine(); ein. Die Eingabe lautet „2.75“, Eingabetaste, „Sample B“, Eingabetaste. Welche Änderung erhält beide beabsichtigten Werte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Kombiniere die Regeln beim Nachvollziehen vollständiger Programme10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Was gibt dieser Code aus?
int a = 4;
int b = 7;
String text = "R=" + a + b;
a += 2;
text += ":" + (a + b);
System.out.println(text);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Welcher Wert wird ausgegeben?
int number = 6_843;
int last = number % 10;
number /= 10;
int next = number % 10;
System.out.println(last * 10 + next);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
'C' zurück in das Zeichen 'E'?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Was gibt dieser Code aus?
int total = 23;
int count = 4;
double a = (double) (total / count);
double b = (double) total / count;
System.out.println((int) (b - a) + ":" + b);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Ein Scanner mit Locale.US erhält „3 2.5“, Eingabetaste, „West Lab“, Eingabetaste. Welche Werte erhalten name und full?
int count = scanner.nextInt();
double mass = scanner.nextDouble();
String name = scanner.nextLine();
String full = scanner.nextLine();
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Welcher Text wird bei US-Formatierung in line gespeichert?
String line = String.format("%d%% / %.1f", 25, 4.25);
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
scanner ist bereit und Locale ist importiert.Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Ablauftabelle
Abschneiden
Anweisung
System.out.println("Ready"); ist eine Anweisung, die eine Nachricht und einen Zeilenumbruch ausgibt.Ausdruck
width * height berechnet eine Fläche, die zugewiesen oder an einen Ausgabeaufruf übergeben werden kann.B
Block
boolean
boolean isMember = true; speichert einen Wahrheitswert, ohne Anführungszeichen oder eine Zahl zu verwenden.Bytecode
.class-Dateien gespeichert und von einer geeigneten Java Virtual Machine ausgeführt wird.java über die JVM ausführen kann.C
char
'7' hat den Code 55; es als char zu speichern, macht es daher nicht zum ganzzahligen Wert 7.Compiler
javac Notice.java startet den Compiler, der bei einem fehlenden Semikolon einen Fehler meldet.D
Deklaration
int count; führt einen Namen ein, aber count braucht noch einen Wert, bevor es ausgelesen wird.Dekrement
-- führt diese Änderung ohne eine gesonderte Subtraktionszuweisung aus.secondsLeft--; verringert die gespeicherte Anzahl verbleibender Sekunden um genau eins.Dividend
/ oder %.-11 % 4 erklärt der negative Dividend, warum auch der Rest ungleich null negativ ist.Divisionsrest
% liefert ein Ergebnis ungleich null mit dem Vorzeichen des Dividenden.23 % 5 die 3 Teile außerhalb der vollständigen Gruppen.double
Double.parseDouble
E
Einengende Typumwandlung
Eingabe-Verarbeitung-Ausgabe-Plan
Erwartete Ausgabe
Erweiternde Typumwandlung
Escape-Sequenz
ermöglicht es einem Ausgabeaufruf, den nächsten Teil seiner Nachricht in eine andere Zeile zu setzen.Explizite Typumwandlung (Cast)
(double) total / count ändert der Cast den Typ eines Operanden, bevor die Division ausgeführt wird.F
Feldbreite
%4d erzeugt drei führende Leerzeichen vor der Ziffer, um das vier Zeichen breite Feld zu füllen.float
f in 2.75f kennzeichnet ein float-Literal, während das einfache 2.75 ein double-Literal ist.Formatierungsgenauigkeit
%f legt sie die Anzahl der Stellen nach dem Dezimaltrennzeichen fest.%.2f macht aus einem angezeigten Wert von 4,5 die Ausgabe „4.50“, ohne die numerische Variable zu ändern.Formatspezifizierer
%d für eine ganze Zahl oder %n für einen Zeilenumbruch.%f verbraucht einen Gleitkommawert, während %n ein Zeilentrennzeichen hinzufügt, ohne einen Wert zu verbrauchen.Formatstring
"Mass: %.2f kg%n" platziert einen Messwert mit zwei Nachkommastellen zwischen Beschriftung und Einheit.G
Ganzzahldivision
23 / 5 ergibt 4 vollständige Gruppen und lässt den Nachkommateil im Quotienten weg.Ganzzahlüberlauf
Gebietsschema
Locale.US eingestellt, ist die Eingabe von Dezimalzahlen mit Punkt auf verschiedenen Computern einheitlich.Genauigkeit
Gleitkommaapproximation
1.1 * 3 zeigen im dargestellten Ergebnis eine Gleitkommaapproximation.I
Initialisierung
double speed = 72.5; deklariert speed und initialisiert die Variable mit einem Messwert in km/h.Inkrement
++ führt diese Änderung in einer einzigen Anweisung aus.count++; ändert eine gespeicherte Anzahl von 8 zu 9, bevor die folgende Anweisung ausgeführt wird.InputMismatchException
nextInt()-Aufruf verursacht eine InputMismatchException, weil eine ganze Zahl benötigt wird.int
int, aber eine Anzahl oberhalb seines Maximums braucht einen ganzzahligen Typ mit größerem Wertebereich.Integer.parseInt
Integer.parseInt("72") gibt 72 zurück, aber ein zusätzliches führendes Leerzeichen macht diesen Ganzzahltext ungültig.J
JDK
javac und java bereitstellt.JVM
K
Klasse
public class Greeting öffnet die Klasse, die die main-Methode des Programms enthält.Kommentar
// oder zwischen /* und */ steht.// Convert to minutes erklärt, warum eine Zeitberechnung einen Stundenwert mit 60 multipliziert.Kompilierfehler
Konkatenation
"Count: " + 8 erstellt eine Nachricht mit einer Beschriftung, einem Leerzeichen und einer Ziffer.Konstante
final kann einmal einen Wert erhalten und danach nicht erneut zugewiesen werden.MINUTES_PER_HOUR gibt der Zahl 60 bei Zeitumrechnungen einen nützlichen Namen.L
Laufzeitfehler
Leerer String
"" + 'A' + 'B', erzeugen die Additionen Text und ergeben den String „AB“.Literal
8, 8L und 8.0 drücken ähnliche Größen aus, haben aber die Typen int, long und double.Logikfehler
long
5_000_000_000L erzeugt ein Literal, das eine große ganzzahlige Anzahl initialisieren kann.M
main-Methode
main, erscheinen ihre Nachrichten in der geschriebenen Reihenfolge.Math-Klasse
Math.sqrt(81) bestimmt eine Quadratwurzel, ohne einen Import oder eine Methodendefinition zu benötigen.N
NaN
0.0 / 0 erzeugt NaN, statt eine Ausnahme für Ganzzahldivision zu werfen.nextLine
nextLine() sofort einen leeren String zurückgeben.NumberFormatException
Integer.parseInt zu parsen, verursacht während der Ausführung eine NumberFormatException.O
Obere Gaußklammer
Operand
"N=" + count bewirkt der String-Operand, dass Plus Text verbindet, statt zwei Zahlen zu addieren.Operatorrangfolge
4 + 3 * 2 hat die Multiplikation Vorrang vor der Addition, sodass zuerst das Produkt gebildet wird.P
Parsen
Primitiver Datentyp
int gespeicherte Anzahl verwendet einen primitiven Datentyp, während ein als String gespeicherter Name einen Klassentyp verwendet.print("Name: ") kann eine Person ihre Antwort auf dem Bildschirm direkt neben der Eingabeaufforderung eingeben.printf
printf("%d items%n", 8) werden die Anzahl, das Wort „items“ und ein abschließendes Zeilentrennzeichen ausgegeben.println
println-Aufrufe zeigen zwei getrennte Zeilen an, auch wenn ihre Literale keine Zeilenumbrüche enthalten.Q
Quellcode
.java-Datei gespeichert wird, bevor der Compiler ihn zur Ausführung übersetzt.R
Runden
S
Scanner
System.in verbundener Scanner kann den Namen einer Person und die von einem Programm benötigten Messwerte einlesen.String
"" geschrieben wird.String.format
String.format(Locale.US, "%.1f km", 8.25) speichern und diesen Text später ausgeben.Stringliteral
"Hello, team" enthält ein Komma und ein Leerzeichen, die genau so in der Ausgabe erscheinen.T
Testfall
Token
nextInt()-Aufrufe einlesen können.U
Untere Gaußklammer
V
Variable
distanceKm speichert einen Messwert, den eine spätere Zeitberechnung durch die Geschwindigkeit dividiert.W
Wissenschaftliche Schreibweise
E.1.0E-4 steht für 0,0001; der negative Exponent beschreibt somit eine kleine Größenordnung.Z
Zusammengesetzte Zuweisung
total += 5; erhöht eine int-Summe um 5 und speichert den geänderten Wert in total.Zuweisung
count = count + 2; enthält count einen um zwei größeren Wert als vor dieser Anweisung.Zwischenwert
- 1Java-Programme kompilieren und starten
- 2Bedingungen und Schleifen in Java
- 3Java-Methoden und Problemzerlegung
- 4Listen, Arrays und Strings in Java
- 5Java-Klassen und Objekte
- 6Objektreferenzen in Java
- 7HashMaps und Collections in Java
- 8Vererbung in Java
- 9Ausnahmen und Dateien in Java
- 10Modultests in Java
- 11Lambda-Ausdrücke und Streams in Java
Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.