Erste Java-Programme kompilieren und starten

Schreibe deine ersten vollständigen Java-Programme: Erstelle eine Klasse mit einer main-Methode, kompiliere und starte sie und behebe die Fehler, die der Compiler und das laufende Programm melden. Speichere Werte in Variablen primitiver Datentypen und in Strings, rechne mit arithmetischen Ausdrücken einschließlich Ganzzahldivision und Divisionsrest und wandle Werte durch explizite Typumwandlung und Parsen zwischen Datentypen um. Lies Text und Zahlen mit Scanner über die Tastatur ein, formatiere Ergebnisse mit printf und verbinde alles zu kleinen Programmen, die du anhand von Hand berechneter Ergebnisse testest.

AnfängerEinheit 1 von 11 in Kurs: Java-Programmierung – Klassen, Vererbung, Collections und Streams

Was du lernst

  1. 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 auf
      Erkenne 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 Fehler
      Mache 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 aus
      Gib 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.
  2. 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 sie
      Erstelle 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 Literale
      Wä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 Konkatenation
      Speichere Text in String-Variablen und erstelle Ausgaben, indem du Strings, Zahlen und Variablen mit dem Operator + verknüpfst. Sage genau voraus, was ausgegeben wird.
  3. 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 Operatorrangfolge
      Kombiniere Werte mit arithmetischen Operatoren, sage die Auswertungsreihenfolge in Java voraus und ändere Variablen mit zusammengesetzter Zuweisung und Inkrement.
    • Verwende Ganzzahldivision und Divisionsrest
      Sage 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-Klasse
      Rechne 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.
  4. 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 Typumwandlungen
      Unterscheide 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 um
      Wandle 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.
  5. 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 ein
      Erstelle 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 printf
      Gib 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 Ausgabe
      Plane, schreibe und teste vollständige Programme, die Werte einlesen, mit passenden Datentypen damit rechnen und verständliche Ergebnisse ausgeben.

Java-Programme kompilieren und starten einfach erklärt

5 Kapitel

1

Schreibe, 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 Hello gehört in Hello.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 ProblemsWas passiertWie du nach der Ursache suchst
KompilierfehlerDer Quellcode lässt sich nicht erfolgreich kompilieren.Lies die erste Compilermeldung und prüfe den Code in der Nähe.
LaufzeitfehlerDie Ausführung stoppt mit einer Ausnahme.Lies die Ausnahme und suche die gemeldete Zeile.
LogikfehlerDie 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.java kompiliert Quellcode; java Hello fü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 LiteralsAusgegebenes Zeichen
\nNeue Zeile
\tTabulator
\"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

  • print bleibt in der aktuellen Zeile; println fügt nach seinem Wert einen Zeilenumbruch hinzu.
  • Anführungszeichen machen Text zum Literal: "name" gibt diese Buchstaben aus, während name den 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.
2

Speichere 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 Anweisungfirstsecondtemp
int temp = first;494
first = second;994
second = temp;944

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.
  • final verhindert eine erneute Zuweisung und var leitet 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
TypSpeicherung und Werte
byte8-Bit-Ganzzahl: −128 bis 127
short16-Bit-Ganzzahl: −32.768 bis 32.767
int32-Bit-Ganzzahl: −2.147.483.648 bis 2.147.483.647
long64-Bit-Ganzzahl: −9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807
float32-Bit-Gleitkommazahl; etwa 7 signifikante Stellen
double64-Bit-Gleitkommazahl; etwa 15–17 signifikante Stellen
charEine 16-Bit-UTF-16-Codeeinheit: 0 bis 65.535
booleantrue 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; String ist eine Klasse.
  • Verwende das Suffix eines Literals, um long (L) oder float (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 char speichert eine UTF-16-Codeeinheit, während ein boolean einen 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:

AusdruckErgebnisGrund
"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.
3

Rechne 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
ReihenfolgeOperatoren oder Gruppierung
ZuerstKlammern
DanachUnä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
AusdruckGespeichertes 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 NaN ergeben.

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.

AufrufErgebnis 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
AufrufErgebnis
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 double erhält Nachkommateile in Ergebnissen, speichert aber viele Dezimalbrüche nur näherungsweise.
  • Math.sqrt, Math.pow und Math.PI ermöglichen geometrische Berechnungen ohne Import.
  • round wählt die nächste ganze Zahl; floor und ceil runden in eine bestimmte Richtung.
  • Math.round(double) gibt long zurück, während floor und ceil double zurückgeben.
  • Verwende beim Zurückskalieren eines gerundeten Werts einen Dezimaldivisor, damit der Nachkommateil erhalten bleibt.
4

Wandle 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;.

AusdruckWas passiertErgebnis
(double) sum / countsum 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.parseInt und Double.parseDouble erzeugen numerische Werte zum Rechnen.
  • Double.parseDouble verwendet unabhängig vom Gebietsschema einen Dezimalpunkt.
  • Ungültiger Zahlentext verursacht eine NumberFormatException; das Parsen ganzer Zahlen weist umgebende Leerzeichen zurück.
  • Boolean.parseBoolean akzeptiert „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.
5

Lies 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
MethodeWas 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.Scanner vor der Klasse und erstelle einen Scanner innerhalb von main.
  • 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 %n für einen Zeilenumbruch und %% für ein auszugebendes Prozentzeichen.
  • %.2f rundet 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.format gibt Text zurück, während printf ihn 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

5 Interaktive Lektionen

1

Erstelle und starte ein kleines Programm zur Textausgabe

13 Schritte
Verfolge ein Programm von seiner Klassenstruktur bis zur genauen Ausgabe und finde dann die Phase, in der ein Fehler auftritt.
  1. 1
    EinführungVerfolge Anweisungen ab main

    Ein Java-Programm braucht einen Einstiegspunkt und eine Folge von Anweisungen. In der klassischen Form enthält eine Klasse main, und main enthä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.

  2. 2
    BeispielPlatziere 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.

  3. 3
    TippPrüfe Namen, bevor du weiteren Code ergänzt

    Speichere die öffentliche Klasse Notice in Notice.java. Achte genau auf das große N. Behalte auch System und den kleingeschriebenen Methodennamen main bei: 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.

  4. 4
    HerausforderungKorrigiere die Einstiegsmethode

    Eine Datei deklariert korrekt public class Bulletin, ihre einzige Methode lautet aber public static void Main(String[] args). Sie wird kompiliert und der Programmstarter findet die main-Methode nicht. Welche Änderung ist nötig?

    ---reveal---

    Ändere Main in main. Der großgeschriebene Name deklariert eine andere Methode und stellt daher nicht den beabsichtigten Einstiegspunkt bereit. Die Datei muss außerdem weiterhin Bulletin.java heißen, passend zu ihrer öffentlichen Klasse.

  5. 5
    ErklärungKompiliere und starte das Hinweisprogramm

    Gib im Quellordner ein:

    javac Notice.java
    java Notice
    

    javac prüft den Quellcode und erzeugt den Bytecode Notice.class. java startet 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 .class weg. java Notice.java ist eine gesonderte Startform für Quelldateien, die seit Java 11 verfügbar ist.

  6. 6
    HerausforderungLies 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.

  7. 7
    BeispielVerfolge 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 print keinen Zeilenumbruch hinzufügt, setzt der zweite Aufruf 3 unmittelbar 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.

  8. 8
    BeispielBeende 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
    Welcome
    

    Zwischen den Meldungen steht keine Leerzeile; ein leeres println() würde eine hinzufügen.

  9. 9
    KernaussageAnfü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 \t und 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.

  10. 10
    HerausforderungSage 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.

  11. 11
    VerbindungBestimme 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.

  12. 12
    HerausforderungUnterscheide 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 print in println oder 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.

  13. 13
    ZusammenfassungPrü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: print bleibt in der Zeile, println wechselt 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.

2

Verfolge gespeicherte Werte und erstelle eine Nachricht

12 Schritte
Verfolge Kopien und Änderungen, wähle Datentypen und sieh, wie Text die Bedeutung von Plus verändert.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVerfolge Werte, bevor du die Ausgabe vorhersagst
  2. 2
    BeispielErstelle zwei unabhängig gespeicherte Werte
  3. 3
    BeispielÄndere nur die benannte Zielvariable
  4. 4
    HerausforderungSichere einen Wert beim Vertauschen
  5. 5
    TippVerwende final und var bewusst
  6. 6
    ErklärungWähle einen Datentyp, der zu den Daten passt
  7. 7
    BeispielLass die Schreibweise des Literals den Typ bestimmen
  8. 8
    HerausforderungWandle vor der Multiplikation erweiternd um
  9. 9
    BeispielErstelle eine Nachricht aus dem Ablauf
  10. 10
    HerausforderungBestimme, wann Plus Addition bedeutet
  11. 11
    HerausforderungVerbinde einen kopierten Wert mit einer neuen Ausgabe
  12. 12
    ZusammenfassungVerwende den aktuellen Wert und den tatsächlichen Typ
3

Teile eine Dauer auf und rechne mit Nachkommateilen

14 Schritte
Arbeite dich durch Rechenreihenfolge, Zeiteinheiten, Dezimalberechnungen und Rundungsentscheidungen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungWähle die zur Frage passende Operation
  2. 2
    ErklärungFasse eine vollständige Berechnung zusammen
  3. 3
    HerausforderungKorrigiere einen Ausdruck für den Mittelwert
  4. 4
    BeispielZähle vollständige Stunden
  5. 5
    BeispielBehalte die Sekunden nach diesen Stunden
  6. 6
    BeispielBestimme Minuten und Sekunden
  7. 7
    HerausforderungTeile eine andere Dauer auf
  8. 8
    KernaussageAbschneiden erfolgt in Richtung null
  9. 9
    BeispielErhalte den Nachkommateil eines Messwerts
  10. 10
    ErklärungVerwende Math für eine Wurzel oder Potenz
  11. 11
    HerausforderungWähle die Rundungsregel
  12. 12
    TippSkaliere mit einem Dezimaldivisor zurück
  13. 13
    HerausforderungErhalte einen Mittelwert vor dem Runden
  14. 14
    ZusammenfassungVerfolge bei jeder Operation Typ und Gruppierung
4

Wandle Werte an der richtigen Stelle um

11 Schritte
Vergleiche erweiternde Typumwandlung, Casts, Parsen und die Umwandlung von Zahlen in Text anhand kurzer Ablaufverfolgungen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungFrag dich, welcher Wert die Umwandlung erreicht
  2. 2
    ErklärungWandle einen numerischen Wert automatisch erweiternd um
  3. 3
    BeispielVergleiche zwei Cast-Positionen
  4. 4
    HerausforderungWandle einen negativen Wert um und runde ihn
  5. 5
    TippBehandle einen Cast nicht als Wertebereichsprüfung
  6. 6
    BeispielParse vor dem Addieren
  7. 7
    ErklärungStimme die Parsing-Methode auf den Text ab
  8. 8
    HerausforderungSage Parsing-Ergebnisse voraus
  9. 9
    VerbindungBereite Text für die Anzeige vor
  10. 10
    HerausforderungVerfolge die gesamte Umwandlungskette
  11. 11
    ZusammenfassungWähle eine Umwandlung passend zu ihrer Aufgabe
5

Lies ein, berechne, formatiere und teste

16 Schritte
Erstelle ein Programm zur Berechnung einer Messgröße und verfolge dabei die Eingabe ganzer Zeilen, Formatstrings und nützliche Tests.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungBaue ein Programm um seine Daten auf
  2. 2
    ErklärungVerbinde einen Scanner mit der Tastatureingabe
  3. 3
    BeispielLies eine Bezeichnung als ganze Zeile ein
  4. 4
    BeispielParse Zahlenzeilen einheitlich
  5. 5
    HerausforderungKorrigiere eine übersprungene Bezeichnung
  6. 6
    TippLege Konventionen für Zahleneingaben ausdrücklich fest
  7. 7
    BeispielRechne mit den vorgesehenen Typen
  8. 8
    ErklärungStimme den Formatstring auf die Werte ab
  9. 9
    BeispielGib einen gerundeten Messwert aus
  10. 10
    HerausforderungKorrigiere den Spezifizierer
  11. 11
    BeispielSpeichere formatierten Text oder richte ihn aus
  12. 12
    ErklärungWähle Tests vor der Ausführung
  13. 13
    HerausforderungFinde einen Rechenfehler mit einem Test
  14. 14
    TippVerfolge den ersten unerwarteten Wert
  15. 15
    HerausforderungÜbertrage den Plan auf eine Geschwindigkeit
  16. 16
    ZusammenfassungPrüfe den gesamten Weg von der Eingabe zum Text

Java-Programme kompilieren und starten: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Lies deinen ersten Java-Code und vollziehe seinen Ablauf nach10 Übungsfragen

Frage 1 von 10

Ein klassisches Programm deklariert public class TrailLog. Wie muss seine Quelldatei heißen?
  1. TrailLog.txt
  2. TrailLog.class
  3. TrailLog.java
  4. TrailLog
Antwort zeigenAntwort ausblenden
Antwort: C
Der Name der öffentlichen Klasse muss genau mit dem Namen der Quelldatei übereinstimmen, gefolgt von .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?
  1. java Desk
  2. java Desk.class
  3. javac Desk
  4. Desk.class
Antwort zeigenAntwort ausblenden
Antwort: A
Der Java-Programmstarter erwartet den Namen der kompilierten Klasse ohne Dateiendung, der Befehl lautet also 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");
  1. Gate /4/Open
  2. Gate4/Open
  3. Gate 4Open
  4. Gate 4/Open
Antwort zeigenAntwort ausblenden
Antwort: D
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;
  1. 14
  2. 8
  3. 6
  4. 22
Antwort zeigenAntwort ausblenden
Antwort: B
Die Initialisierung kopiert den aktuellen Wert 8 aus 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

Welches Suffix macht 4.25 in Java zu einem float-Literal?
  1. L
  2. d
  3. f
  4. Kein Suffix
Antwort zeigenAntwort ausblenden
Antwort: C
Das Suffix 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

Was gibt System.out.println("Seats: " + 6 + 2); aus?
  1. Seats: 8
  2. Seats: 62
  3. Seats: 6 2
  4. Seats: 6+2
Antwort zeigenAntwort ausblenden
Antwort: B
Das erste Plus verbindet den String und 6 zu „Seats: 6“. Das zweite Plus verbindet diesen Text mit 2 und erzeugt „Seats: 62“, ohne ein Leerzeichen einzufügen. Für die Ausgabe „Seats: 8“ wären Klammern um 6 + 2 nötig, damit die Zahlen vor der Konkatenation addiert werden.

Frage 7 von 10

Welcher Wert wird durch int result = 18 - 6 / 3 * 2; zugewiesen?
  1. 14
  2. 8
  3. 16
  4. 2
Antwort zeigenAntwort ausblenden
Antwort: A
Division und Multiplikation haben Vorrang vor der Subtraktion und werden von links nach rechts gruppiert. 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

Welchen Wert hat der Java-Ausdruck -11 / 4?
  1. -2.75
  2. -3
  3. 2
  4. -2
Antwort zeigenAntwort ausblenden
Antwort: D
Beide Operanden sind ganze Zahlen, daher schneidet Java den Nachkommateil in Richtung null ab und gibt −2 zurück. Der Wert −3 entstünde beim Abrunden in Richtung negativer Unendlichkeit, was die Ganzzahldivision nicht tut. Damit −2,75 erhalten bleibt, muss vor der Division mindestens ein Operand ein Gleitkommatyp sein.

Frage 9 von 10

Welcher Ausdruck ergibt bei int total = 19; int groups = 4; einen Quotienten mit Nachkommateil?
  1. (double) (total / groups)
  2. (double) total / groups
  3. total / (int) groups
  4. (int) (total / 4.0)
Antwort zeigenAntwort ausblenden
Antwort: B
Der Cast von 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);
  1. 27:Mina:Chen
  2. 27::Mina Chen
  3. 27:Mina: Chen
  4. 27:Mina Chen:
Antwort zeigenAntwort ausblenden
Antwort: C
Das zusätzliche 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

Wo beginnt in einem klassischen Programm die Ausführung?
  1. Beim ersten Import.
  2. Bei der Klassendeklaration.
  3. Bei der letzten Anweisung in main.
  4. Bei der ersten Anweisung in main.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Programm wird kompiliert und läuft zu Ende, gibt aber für double average = 19 / 4; den Wert 4.0 aus. Welche Fehlerart erklärt den ungenauen Mittelwert?
  1. Ein Logikfehler durch Ganzzahldivision.
  2. Ein Laufzeitfehler durch Ganzzahldivision.
  3. Ein Kompilierfehler durch Zuweisung.
  4. Ein Laufzeitfehler durch Überlauf.
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;
  1. left = 7, right = 2
  2. left = 2, right = 7
  3. left = 7, right = 7
  4. left = 2, right = 2
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Programm muss die ganzzahlige Anzahl 4.200.000.001 exakt speichern. Welche Deklaration leistet das?
  1. int count = 4_200_000_001;
  2. long count = 4_200_000_001L;
  3. long count = 4_200_000_001;
  4. float count = 4_200_000_001f;
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Aufnahme dauert 247 Sekunden. Welche Minuten- und Sekundenwerte ergeben sich bei der Aufteilung in volle Minuten und verbleibende Sekunden?
  1. 4 min 11 s
  2. 5 min 7 s
  3. 4 min 7 s
  4. 4 min 47 s
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Welchen Wert gibt Math.floor(-4.2) zurück?
  1. -4.0
  2. -5.0
  3. 4.0
  4. 5.0
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?
  1. quantity + 5
  2. (int) quantity + 5
  3. Integer.toString(16) + 5
  4. Integer.parseInt(quantity) + 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Person gibt den vollständigen Namen „Noor van Dijk“ in einer neuen Eingabezeile ein. Welcher Scanner-Aufruf liest den ganzen Namen in einen String ein?
  1. scanner.nextLine()
  2. scanner.next()
  3. scanner.nextInt()
  4. scanner.nextBoolean()
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welchen Text gibt System.out.printf("Mass: %.2f kg%n", 6.375); bei US-Formatierung vor dem Zeilenumbruch aus?
  1. Mass: 6.37 kg
  2. Mass: 6.375 kg
  3. Mass: 6.38 kg
  4. Mass: 6.375000 kg
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Geschwindigkeitsprogramm verwendet 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?
  1. double speed = (double) km / minutes * 60;
  2. double speed = (double) (km / minutes) * 60;
  3. double speed = km / minutes * 60.0;
  4. double speed = km / (minutes * 60.0);
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

Welches Java-Stringliteral gibt den Text Path: C:\Work mit genau einem umgekehrten Schrägstrich aus?
  1. "Path: C:\Work"
  2. "Path: C:\\Work"
  3. "Path: C:/Work"
  4. "Path: C:\nWork"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was gibt System.out.println(3 + 4 + " / " + 3 * 4); aus?
  1. 7 / 12
  2. 7 / 34
  3. 34 / 34
  4. 34 / 12
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);
  1. 8
  2. 3.5
  3. 7
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welcher Wert wird durch double value = Math.round(8.276 * 100) / 100; gespeichert?
  1. 8.28
  2. 8.27
  3. 8.0
  4. 828.0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welcher int-Wert ergibt sich aus (int) -6.8?
  1. -7
  2. -6
  3. 6
  4. 7
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was geschieht bei der Auswertung von Integer.parseInt(" 58")?
  1. Die Methode gibt den int-Wert 58 zurück.
  2. Die Methode gibt den String „58“ zurück.
  3. Die Methode wirft eine InputMismatchException.
  4. Die Methode wirft eine NumberFormatException.
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();
  1. " Park"
  2. "Park"
  3. ""
  4. "Lina Park"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welcher Text wird bei US-Formatierung durch System.out.printf("[%4d][%-5s]", 7, "Oak"); genau ausgegeben?
  1. [7 ][Oak ]
  2. [ 7][ Oak]
  3. [ 7][Oak ]
  4. [ 7][Oak ]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Programm erhält 10,5 Liter, die gleichmäßig auf 4 Behälter aufgeteilt werden. Es soll den Anteil mit Nachkommateil für die spätere Verwendung erhalten und bei US-Formatierung „2.63 L“ ausgeben. Welche Berechnung und Ausgabe erfüllen beide Anforderungen?
  1. int share = (int) (10.5 / 4); System.out.printf(Locale.US, "%.2f L", (double) share);
  2. double share = 10.5 / 4; System.out.printf(Locale.US, "%.2f L", share);
  3. double share = Math.round(10.5 / 4); System.out.printf(Locale.US, "%.2f L", share);
  4. double share = 10.5 / 4; System.out.printf(Locale.US, "%d L", share);
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Zeitmesser speichert int seconds = 7_489;. Welches Ausdruckspaar ergibt die vollen Stunden und die verbleibenden ganzen Minuten innerhalb der aktuellen Stunde?
  1. seconds / 3600, seconds / 60
  2. seconds % 3600, seconds / 60
  3. seconds / 3600, seconds % 60
  4. seconds / 3600, seconds % 3600 / 60
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

Welches Satzzeichen beendet die Java-Anweisung System.out.println("Ready")?
  1. Eine schließende Klammer: }
  2. Ein Doppelpunkt: :
  3. Ein Semikolon: ;
  4. Ein Komma: ,
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Nachdem eine lernende Person eine schließende Klammer gelöscht hat, sieht sie mehrere Compilerfehler in späteren Zeilen. Was ist der beste nächste Schritt?
  1. Den ersten Fehler und die benachbarten Klammern prüfen, die fehlende Klammer ergänzen und erneut kompilieren.
  2. Den letzten Fehler zuerst beheben und dann jede zuvor vom Compiler genannte Zeile ändern.
  3. Die zuletzt kompilierte Klasse wiederholt starten, bis die Compilermeldungen verschwinden.
  4. Die Klasse umbenennen und starten, bevor der gespeicherte Quellcode erneut geprüft wird.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was geschieht nach var count = 6;, wenn dieselbe Methode count = 6.5; ausführt?
  1. Die Variable ändert sich von int zu double.
  2. Die Dezimalzahl wird stillschweigend als 6 gespeichert.
  3. Das Programm wird kompiliert, stoppt aber zur Laufzeit.
  4. Die Kompilierung schlägt fehl, weil count ein int ist.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Zähler verwendet 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?
  1. long area = (long) (edge * edge);
  2. long area = (long) edge * edge;
  3. long area = (int) edge * edge;
  4. long area = edge * edge + 0L;
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);
  1. 8.25
  2. 9.0
  3. 8.0
  4. 6.0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein rechtwinkliges Dreieck hat Katheten von 5 cm und 12 cm. Welchen Wert gibt Math.sqrt(5 * 5 + 12 * 12) zurück?
  1. 13.0
  2. 17.0
  3. 169.0
  4. 60.0
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);
  1. 2.95
  2. 2.75
  3. 3.0
  4. 2.0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was gibt Boolean.parseBoolean("Yes") zurück?
  1. true, weil Yes eine Zustimmung ausdrückt.
  2. false, weil der Text nicht true lautet.
  3. Die Methode wirft eine NumberFormatException.
  4. Die Methode wirft eine InputMismatchException.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Test eines Sekundenumrechners verwendet 61 Sekunden und erwartet „1 min 1 s“. Das Programm gibt „1 min 61 s“ aus. Es verwendet minutes = totalSeconds / 60; seconds = totalSeconds;. Welche Korrektur behebt die Berechnung?
  1. seconds = totalSeconds / 60;
  2. seconds = minutes % 60;
  3. seconds = totalSeconds % 60;
  4. seconds = totalSeconds - minutes;
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Scanner verwendet 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?
  1. Nach dem numerischen Einlesen next() für die Bezeichnung verwenden.
  2. Locale.US entfernen und beide Leseaufrufe unverändert lassen.
  3. Die Bezeichnung zweimal einlesen und die Ergebnisse verknüpfen.
  4. Die Masse mit Double.parseDouble(scanner.nextLine()) einlesen.
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

Welche Escape-Sequenz fügt ein doppeltes Anführungszeichen in ein gewöhnliches Java-Stringliteral ein?
  1. \n
  2. \t
  3. \"
  4. \\
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);
  1. R=47:13
  2. R=11:13
  3. R=67:13
  4. R=47:67
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Werkstatt hat 83 Teile. Jede Schale fasst 15 Teile. Wie viele volle Schalen und übrige Teile gibt es?
  1. 5 Schalen und 3 Teile
  2. 6 Schalen und 8 Teile
  3. 6 Schalen und 7 Teile
  4. 5 Schalen und 8 Teile
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);
  1. 34
  2. 43
  3. 84
  4. 33
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welcher Ausdruck wandelt das Ergebnis der Addition von 2 zum Zeichencode von 'C' zurück in das Zeichen 'E'?
  1. (char) 'C' + 2
  2. (char) ('C' + 2)
  3. (int) ('C' + 2)
  4. "C" + 2
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);
  1. 1:5.75
  2. 0:5.0
  3. 0:5.75
  4. 1:5.0
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();
  1. name = "West", full = " Lab"
  2. name = "West Lab", full = ""
  3. name = "", full = "West"
  4. name = "", full = "West Lab"
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);
  1. 25% / 4.2
  2. 25% / 4.3
  3. 25%% / 4.3
  4. 25% / 4.250000
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Programm liest zwei ganzzahlige Testergebnisse in getrennten Zeilen ein: 11 und 14. Es muss ihren Mittelwert mit Nachkommateil speichern und „Mean: 12.50“ mit einem abschließenden Zeilenumbruch anzeigen, auf jedem Computer mit einem Punkt. Welcher Code für Eingabe, Berechnung und Ausgabe erfüllt diese Anforderungen? Ein Scanner namens scanner ist bereit und Locale ist importiert.
  1. int a = scanner.nextInt(); int b = scanner.nextInt(); double mean = (a + b) / 2; System.out.printf(Locale.US, "Mean: %.2f%n", mean);
  2. int a = Integer.parseInt(scanner.nextLine()); int b = Integer.parseInt(scanner.nextLine()); double mean = (a + b) / 2.0; System.out.printf("Mean: %.2f%n", mean);
  3. int a = Integer.parseInt(scanner.nextLine()); int b = Integer.parseInt(scanner.nextLine()); double mean = (a + b) / 2.0; System.out.printf(Locale.US, "Mean: %.2f%n", mean);
  4. int a = Integer.parseInt(scanner.nextLine()); int b = Integer.parseInt(scanner.nextLine()); double mean = (a + b) / 2.0; System.out.println("Mean: " + mean);
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Programm gibt die Fahrzeit einer Strecke als ganze Stunden und verbleibende Minuten aus, gerundet auf die nächste Minute. Welche Ausgabe sollte es für 121,5 km bei gleichbleibenden 54 km/h erzeugen?
  1. 2 h 15 min
  2. 2 h 25 min
  3. 2 h 0 min
  4. 3 h 0 min
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

75 Schlüsselbegriffe, jeweils mit Definition

A

Ablauftabelle
Eine Ablauftabelle hält Variablenwerte nach aufeinanderfolgenden Anweisungen fest, sodass Änderungen ohne Ausführung des Codes verfolgt werden können.
Eine Ablauftabelle für einen Tausch zeigt, welcher ursprüngliche Wert in der temporären Variablen gesichert wird.
Abschneiden
Beim Abschneiden wird der Nachkommateil in Richtung null verworfen, wenn ein Gleitkommawert innerhalb des Wertebereichs in eine ganze Zahl umgewandelt wird.
Ein Cast von -8,6 zu int ergibt durch Abschneiden -8, während Abrunden stattdessen -9 ergeben würde.
Anweisung
Eine Anweisung ist eine Java-Instruktion, etwa eine Zuweisung oder ein Methodenaufruf; eine Ausgabeanweisung endet mit einem Semikolon.
Die Zeile System.out.println("Ready"); ist eine Anweisung, die eine Nachricht und einen Zeilenumbruch ausgibt.
Ausdruck
Ein Ausdruck ist Java-Code, der einen Wert berechnet oder eine Operation ausführt, etwa zwei Werte addiert oder eine Methode aufruft.
Der Ausdruck width * height berechnet eine Fläche, die zugewiesen oder an einen Ausgabeaufruf übergeben werden kann.

B

Block
Ein Block ist eine Gruppe von Anweisungen, die von passenden geschweiften Klammern eingeschlossen ist, sodass Java sie als einen Rumpf behandeln kann.
Die Klammern nach dem main-Kopf umschließen die Anweisungen, die zum Rumpf dieser Methode gehören.
boolean
Der Typ boolean speichert einen der beiden Wahrheitswerte true und false und akzeptiert keine Zahlen als Ersatz.
Die Deklaration boolean isMember = true; speichert einen Wahrheitswert, ohne Anführungszeichen oder eine Zahl zu verwenden.
Bytecode
Bytecode ist die kompilierte Form von Anweisungen, die in Java-.class-Dateien gespeichert und von einer geeigneten Java Virtual Machine ausgeführt wird.
Eine erfolgreiche Kompilierung erzeugt Bytecode, den der Programmstarter java über die JVM ausführen kann.

C

char
Der Typ char speichert eine 16-Bit-UTF-16-Codeeinheit, die als Literal in einfachen Anführungszeichen geschrieben wird und einen Zahlenwert von 0 bis 65.535 hat.
Das Zeichen '7' hat den Code 55; es als char zu speichern, macht es daher nicht zum ganzzahligen Wert 7.
Compiler
Ein Compiler prüft Quellcode anhand der Sprachregeln und übersetzt gültigen Code in eine andere Form, etwa Java-Bytecode.
Der Aufruf javac Notice.java startet den Compiler, der bei einem fehlenden Semikolon einen Fehler meldet.

D

Deklaration
Eine Deklaration führt den Namen und den Typ einer Variablen ein; sie kann auch einen Initialisierungswert enthalten, der einen Anfangswert liefert.
Die Deklaration int count; führt einen Namen ein, aber count braucht noch einen Wert, bevor es ausgelesen wird.
Dekrement
Ein Dekrement verringert den Wert einer Variablen um eins; der Java-Operator -- führt diese Änderung ohne eine gesonderte Subtraktionszuweisung aus.
Die Anweisung secondsLeft--; verringert die gespeicherte Anzahl verbleibender Sekunden um genau eins.
Dividend
Ein Dividend ist der Wert, der dividiert wird; in einem Java-Divisionsausdruck mit zwei Operanden steht er links von / oder %.
In -11 % 4 erklärt der negative Dividend, warum auch der Rest ungleich null negativ ist.
Divisionsrest
Ein Divisionsrest ist der Wert, der nach einer Ganzzahldivision übrig bleibt; der Java-Operator % liefert ein Ergebnis ungleich null mit dem Vorzeichen des Dividenden.
Werden 23 Teile in Gruppen zu je 5 verpackt, ergibt 23 % 5 die 3 Teile außerhalb der vollständigen Gruppen.
double
Der Typ double speichert binäre 64-Bit-Gleitkommawerte und behält üblicherweise etwa 15–17 signifikante Dezimalstellen.
Eine Strecke von 18,75 km kann als double gespeichert werden, damit bei späteren Berechnungen Nachkommateile erhalten bleiben.
Double.parseDouble
Die Methode Double.parseDouble wandelt gültigen Gleitkommatext unabhängig vom Gebietsschema mit einem Dezimalpunkt in einen double um.
Eine ganze Eingabezeile mit „2.75“ kann auf Systemen mit Dezimalpunkt ebenso wie auf Systemen mit Dezimalkomma als double geparst werden.

E

Einengende Typumwandlung
Eine einengende Typumwandlung führt zu einer stärker eingeschränkten numerischen Darstellung, etwa von double zu int, und kann Informationen verlieren.
Die Umwandlung von 6,75 in einen int ist einengend, weil der Zieltyp den Nachkommateil nicht erhalten kann.
Eingabe-Verarbeitung-Ausgabe-Plan
Ein Eingabe-Verarbeitung-Ausgabe-Plan legt fest, was ein Programm einliest, wie es diese Werte verarbeitet und welche Ergebnisse es darstellt.
Ein Geschwindigkeitsrechner liest Strecke und Zeit ein, dividiert sie mit zueinander passenden Einheiten und beschriftet sein Ergebnis.
Erwartete Ausgabe
Die erwartete Ausgabe besteht aus Text und Werten, die ein korrektes Programm für festgelegte Eingaben erzeugen sollte und die vor dem Test ermittelt werden.
Der Vergleich der erwarteten mit der tatsächlichen Ausgabe kann eine falsche Zahl, eine fehlende Einheit oder ein zusätzliches Leerzeichen aufdecken.
Erweiternde Typumwandlung
Eine erweiternde Typumwandlung ist eine automatische numerische Umwandlung entlang der in Java erlaubten Typpfade, etwa von int zu long oder double.
Wird eine int-Anzahl einem double-Messwert zugewiesen, wird sie automatisch umgewandelt und erhält eine Dezimaldarstellung.
Escape-Sequenz
Eine Escape-Sequenz ist ein mit einem umgekehrten Schrägstrich beginnender Code innerhalb eines Literals, der für ein Zeichen wie einen Zeilenumbruch oder ein Anführungszeichen steht.
Die Escape-Sequenz ermöglicht es einem Ausgabeaufruf, den nächsten Teil seiner Nachricht in eine andere Zeile zu setzen.
Explizite Typumwandlung (Cast)
Eine explizite Typumwandlung fordert eine Typumwandlung ausdrücklich an, indem der Zieltyp in Klammern vor den umzuwandelnden Wert gesetzt wird.
In (double) total / count ändert der Cast den Typ eines Operanden, bevor die Division ausgeführt wird.

F

Feldbreite
Eine Feldbreite ist die Mindestzahl der für einen formatierten Wert reservierten Zeichen; ist der Wert kürzer, werden Leerzeichen hinzugefügt.
Die Formatierung von 7 mit %4d erzeugt drei führende Leerzeichen vor der Ziffer, um das vier Zeichen breite Feld zu füllen.
float
Der Typ float speichert binäre 32-Bit-Gleitkommawerte mit einer Genauigkeit von etwa sieben signifikanten Dezimalstellen.
Das Suffix f in 2.75f kennzeichnet ein float-Literal, während das einfache 2.75 ein double-Literal ist.
Formatierungsgenauigkeit
Die Formatierungsgenauigkeit steuert Details in der formatierten Ausgabe; bei %f legt sie die Anzahl der Stellen nach dem Dezimaltrennzeichen fest.
Die Genauigkeitsangabe in %.2f macht aus einem angezeigten Wert von 4,5 die Ausgabe „4.50“, ohne die numerische Variable zu ändern.
Formatspezifizierer
Ein Formatspezifizierer ist eine mit einem Prozentzeichen beginnende Anweisung innerhalb eines Formatstrings, etwa %d für eine ganze Zahl oder %n für einen Zeilenumbruch.
Jedes %f verbraucht einen Gleitkommawert, während %n ein Zeilentrennzeichen hinzufügt, ohne einen Wert zu verbrauchen.
Formatstring
Ein Formatstring verbindet wörtlichen Text mit Spezifizierern, die mit einem Prozentzeichen beginnen und steuern, wo und wie übergebene Werte erscheinen.
Der Formatstring "Mass: %.2f kg%n" platziert einen Messwert mit zwei Nachkommastellen zwischen Beschriftung und Einheit.

G

Ganzzahldivision
Die Ganzzahldivision dividiert zwei ganzzahlige Operanden und schneidet einen Nachkommateil des Quotienten in Richtung null ab.
Der Java-Ausdruck 23 / 5 ergibt 4 vollständige Gruppen und lässt den Nachkommateil im Quotienten weg.
Ganzzahlüberlauf
Ein Ganzzahlüberlauf tritt auf, wenn eine Ganzzahlberechnung den Wertebereich ihres Typs überschreitet und zu einem anderen Wert überläuft.
Die Multiplikation zweier großer int-Werte kann überlaufen, bevor ihr Produkt einer long-Variablen zugewiesen wird.
Gebietsschema
Ein Gebietsschema ist eine Sprach- und Regionseinstellung, die Konventionen wie das Dezimaltrennzeichen bei numerischer Eingabe und Formatierung steuert.
Wird ein Scanner auf Locale.US eingestellt, ist die Eingabe von Dezimalzahlen mit Punkt auf verschiedenen Computern einheitlich.
Genauigkeit
Genauigkeit beschreibt, wie viele signifikante Details ein numerischer Typ darstellen kann; ein großer Wertebereich garantiert keine exakten Werte.
Die Umwandlung eines großen int in float kann die Genauigkeit verringern, obwohl Java die erweiternde Typumwandlung erlaubt.
Gleitkommaapproximation
Eine Gleitkommaapproximation ist ein benachbarter darstellbarer Binärwert, der verwendet wird, wenn ein Dezimalbruch nicht exakt gespeichert werden kann.
Zusätzliche Dezimalstellen am Ende von 1.1 * 3 zeigen im dargestellten Ergebnis eine Gleitkommaapproximation.

I

Initialisierung
Die Initialisierung gibt einer Variablen ihren ersten Wert, häufig in derselben Anweisung, die ihren Namen und Typ deklariert.
Die Zeile double speed = 72.5; deklariert speed und initialisiert die Variable mit einem Messwert in km/h.
Inkrement
Ein Inkrement erhöht den Wert einer Variablen um eins; der Java-Operator ++ führt diese Änderung in einer einzigen Anweisung aus.
Ein eigenständiges count++; ändert eine gespeicherte Anzahl von 8 zu 9, bevor die folgende Anweisung ausgeführt wird.
InputMismatchException
Eine InputMismatchException ist eine Laufzeitausnahme beim Einlesen eines Tokens durch Scanner, wenn das Token nicht zum angeforderten Typ passt.
Die Eingabe „3.5“ für einen nextInt()-Aufruf verursacht eine InputMismatchException, weil eine ganze Zahl benötigt wird.
int
Der Typ int speichert vorzeichenbehaftete 32-Bit-Ganzzahlen im Bereich von −2.147.483.648 bis 2.147.483.647.
Eine kleine Bestandsanzahl passt in einen int, aber eine Anzahl oberhalb seines Maximums braucht einen ganzzahligen Typ mit größerem Wertebereich.
Integer.parseInt
Die Methode Integer.parseInt wandelt gültigen Ganzzahltext in einen int um und weist ungültigen Text mit einer NumberFormatException zurück.
Integer.parseInt("72") gibt 72 zurück, aber ein zusätzliches führendes Leerzeichen macht diesen Ganzzahltext ungültig.

J

JDK
Das JDK oder Java Development Kit ist das Softwarepaket, das Java-Entwicklungswerkzeuge einschließlich javac und java bereitstellt.
Ein Computer braucht ein JDK, um den Quellcode im Terminal zu kompilieren und anschließend das entstandene Programm zu starten.
JVM
Die JVM oder Java Virtual Machine ist das Laufzeitsystem, das Java-Bytecode auf einem bestimmten Computer ausführt.
Dieselbe kompatible Klassendatei kann auf verschiedenen Betriebssystemen mit geeigneten JVMs laufen.

K

Klasse
Eine Klasse ist eine benannte Java-Programmstruktur, deren Rumpf Mitglieder wie Methoden enthält; ein klassisches erstes Programm deklariert eine Klasse.
Die Deklaration public class Greeting öffnet die Klasse, die die main-Methode des Programms enthält.
Kommentar
Ein Kommentar ist erläuternder Quelltext, den der Compiler ignoriert und der nach // oder zwischen /* und */ steht.
Der Kommentar // Convert to minutes erklärt, warum eine Zeitberechnung einen Stundenwert mit 60 multipliziert.
Kompilierfehler
Ein Kompilierfehler ist ein Verstoß, der bei der Prüfung des Java-Quellcodes erkannt wird und dessen erfolgreiche Kompilierung verhindert.
Ein nicht geschlossenes gewöhnliches Stringliteral erzeugt einen Kompilierfehler, bevor das Programm ausgeführt werden kann.
Konkatenation
Konkatenation verbindet Werte zu einem neuen String und wandelt einen Operanden, der kein String ist, in Text um, wenn der andere Operand ein String ist.
Die Konkatenation "Count: " + 8 erstellt eine Nachricht mit einer Beschriftung, einem Leerzeichen und einer Ziffer.
Konstante
Eine Konstante ist ein fester Wert; eine Java-Variable mit final kann einmal einen Wert erhalten und danach nicht erneut zugewiesen werden.
Die Konstante MINUTES_PER_HOUR gibt der Zahl 60 bei Zeitumrechnungen einen nützlichen Namen.

L

Laufzeitfehler
Ein Laufzeitfehler ist ein Fehler während der Programmausführung, der häufig als Ausnahme gemeldet wird und das laufende Programm stoppt.
Die Division durch eine ganzzahlige Variable mit dem Wert null erzeugt bei der Divisionsanweisung einen Laufzeitfehler.
Leerer String
Ein leerer String ist ein String ohne Zeichen, geschrieben als zwei unmittelbar aufeinanderfolgende doppelte Anführungszeichen ohne Inhalt dazwischen.
Beginnt der Ausdruck mit "" + 'A' + 'B', erzeugen die Additionen Text und ergeben den String „AB“.
Literal
Ein Literal ist ein direkt im Quellcode geschriebener Wert, dessen Form und Suffix den Typ dieses Werts bestimmen.
Die Literale 8, 8L und 8.0 drücken ähnliche Größen aus, haben aber die Typen int, long und double.
Logikfehler
Ein Logikfehler ist ein Fehler, durch den ein Programm ein falsches Ergebnis erzeugt, obwohl es kompiliert wird und vollständig durchläuft.
Die Ausgabe eines Mittelwerts von 4,0, wenn das erwartete Ergebnis 4,75 ist, zeigt einen Logikfehler in der Berechnung.
long
Der Typ long speichert vorzeichenbehaftete 64-Bit-Ganzzahlen und ist nützlich, wenn eine exakte ganze Zahl den Wertebereich von int überschreiten kann.
Das Suffix in 5_000_000_000L erzeugt ein Literal, das eine große ganzzahlige Anzahl initialisieren kann.

M

main-Methode
Die main-Methode ist die Einstiegsmethode, in der der Java-Programmstarter mit der Ausführung der Anweisungen eines kleinen Programms beginnt.
Stehen zwei Ausgabeanweisungen in main, erscheinen ihre Nachrichten in der geschriebenen Reihenfolge.
Math-Klasse
Die Math-Klasse stellt fertige statische Methoden und Konstanten für numerische Aufgaben bereit, darunter Wurzeln, Potenzen und Rundung.
Der Aufruf Math.sqrt(81) bestimmt eine Quadratwurzel, ohne einen Import oder eine Methodendefinition zu benötigen.

N

NaN
NaN bedeutet „keine Zahl“ und ist ein spezielles Gleitkommaergebnis für eine undefinierte numerische Operation wie null geteilt durch null.
Die double-Berechnung 0.0 / 0 erzeugt NaN, statt eine Ausnahme für Ganzzahldivision zu werfen.
nextLine
Die Methode nextLine liest den verbleibenden Text der aktuellen Eingabezeile und verbraucht deren Ende, ohne es zurückzugeben.
Nach einem ganzzahligen Token am Zeilenende kann nextLine() sofort einen leeren String zurückgeben.
NumberFormatException
Eine NumberFormatException ist eine Laufzeitausnahme, die ausgelöst wird, wenn beim numerischen Parsen der übergebene Text nicht in den angeforderten Typ umgewandelt werden kann.
Der Versuch, „eight“ mit Integer.parseInt zu parsen, verursacht während der Ausführung eine NumberFormatException.

O

Obere Gaußklammer
Die obere Gaußklammer eines Werts ist die kleinste ganzzahlige Zahl, die nicht kleiner als dieser Wert ist; Math.ceil gibt sie als double zurück.
Für 4,2 Gruppen ist die obere Gaußklammer 5,0 und stellt die nächste ganze Zahl in aufsteigender Richtung dar.
Operand
Ein Operand ist ein Wert oder Ausdruck, der einem Operator übergeben wird; die Typen der Operanden bestimmen mit, welche Operation Java ausführt.
In "N=" + count bewirkt der String-Operand, dass Plus Text verbindet, statt zwei Zahlen zu addieren.
Operatorrangfolge
Die Operatorrangfolge ist die Priorität, die bestimmt, wie Operationen gruppiert werden, wenn ein Ausdruck verschiedene Operatoren enthält.
In 4 + 3 * 2 hat die Multiplikation Vorrang vor der Addition, sodass zuerst das Produkt gebildet wird.

P

Parsen
Parsen interpretiert Text nach einem Format und wandelt ihn in einen verwendbaren Wert um, etwa einen int oder double.
Das Parsen des Strings „72“ ermöglicht es einem Programm, 8 numerisch zu addieren, statt den Text „728“ zu erzeugen.
Primitiver Datentyp
Ein primitiver Datentyp ist einer der acht eingebauten Werttypen von Java: byte, short, int, long, float, double, char oder boolean.
Eine als int gespeicherte Anzahl verwendet einen primitiven Datentyp, während ein als String gespeicherter Name einen Klassentyp verwendet.
print
Die Methode print schreibt einen Wert in die Ausgabe, ohne einen Zeilenumbruch hinzuzufügen, sodass die nächste Ausgabe in derselben Zeile bleibt.
Mit print("Name: ") kann eine Person ihre Antwort auf dem Bildschirm direkt neben der Eingabeaufforderung eingeben.
printf
Die Methode printf schreibt Werte gemäß einem Formatstring und fügt nur dann einen Zeilenumbruch hinzu, wenn dieser String ihn anfordert.
Mit printf("%d items%n", 8) werden die Anzahl, das Wort „items“ und ein abschließendes Zeilentrennzeichen ausgegeben.
println
Die Methode println schreibt einen Wert gefolgt von einem Zeilenumbruch; ohne Argument schreibt sie nur den Zeilenumbruch.
Zwei aufeinanderfolgende println-Aufrufe zeigen zwei getrennte Zeilen an, auch wenn ihre Literale keine Zeilenumbrüche enthalten.

Q

Quellcode
Quellcode ist der menschenlesbare Java-Text, der in einer .java-Datei gespeichert wird, bevor der Compiler ihn zur Ausführung übersetzt.
Änderst du eine Nachricht im Quellcode, ändert sich nach dem Speichern und Kompilieren das nächste kompilierte Programm.

R

Runden
Beim Runden wird ein Wert durch einen benachbarten Wert mit einer gewählten Genauigkeit ersetzt; Math.round wählt die nächste ganze Zahl und rundet Werte genau in der Mitte auf.
Das Runden einer Zeit auf ganze Minuten kann erfolgen, nachdem die Dauer als double in Minuten berechnet wurde.

S

Scanner
Ein Scanner ist eine Java-Klasse, die Eingaben als Zeilen oder Token einliest und Token in primitive Werte wie Zahlen umwandeln kann.
Ein mit System.in verbundener Scanner kann den Namen einer Person und die von einem Programm benötigten Messwerte einlesen.
String
Der Java-Klassentyp String steht für eine Folge von Textzeichen, einschließlich der gültigen leeren Folge, die als "" geschrieben wird.
Ein String kann die Bezeichnung „Room 204“ enthalten, ohne deren Ziffern als Zahl für Berechnungen zu behandeln.
String.format
Die Methode String.format wendet einen Formatstring an und gibt den entstehenden Text zurück, statt ihn direkt auszugeben.
Ein Programm kann String.format(Locale.US, "%.1f km", 8.25) speichern und diesen Text später ausgeben.
Stringliteral
Ein Stringliteral ist Text zwischen doppelten Anführungszeichen im Java-Quellcode, wobei Escape-Sequenzen für Sonderzeichen verwendet werden.
Das Stringliteral "Hello, team" enthält ein Komma und ein Leerzeichen, die genau so in der Ausgabe erscheinen.

T

Testfall
Ein Testfall legt Eingaben und ein erwartetes Ergebnis fest, sodass das tatsächliche Verhalten eines Programms anhand eines bekannten Ergebnisses geprüft werden kann.
Der Testfall 120 km bei 60 km/h erwartet von einem Programm zur Fahrzeitumrechnung 2 h 0 min.
Token
Ein Token ist ein durch ein Trennzeichen abgegrenzter Teil einer Eingabe; ein Scanner verwendet standardmäßig Leerraum, um seine Token zu trennen.
Die Eingabe „4 7“ enthält zwei numerische Token, die zwei aufeinanderfolgende nextInt()-Aufrufe einlesen können.

U

Untere Gaußklammer
Die untere Gaußklammer eines Werts ist die größte ganzzahlige Zahl, die nicht größer als dieser Wert ist; Math.floor gibt sie als double zurück.
Für eine negative Zahl mit Nachkommateil wie -4,2 ist die untere Gaußklammer -5,0, was auf dem Zahlenstrahl darunter liegt.

V

Variable
Eine Variable ist ein benannter Speicherplatz für einen Wert eines bestimmten Typs, sodass spätere Anweisungen den gespeicherten Wert lesen oder ändern können.
Die Variable distanceKm speichert einen Messwert, den eine spätere Zeitberechnung durch die Geschwindigkeit dividiert.

W

Wissenschaftliche Schreibweise
Die wissenschaftliche Schreibweise stellt eine Zahl als Koeffizienten multipliziert mit einer Zehnerpotenz dar und verwendet bei Java-Ausgaben E.
Der ausgegebene Wert 1.0E-4 steht für 0,0001; der negative Exponent beschreibt somit eine kleine Größenordnung.

Z

Zusammengesetzte Zuweisung
Eine zusammengesetzte Zuweisung verbindet eine Operation mit einer Zuweisung und enthält die Rückumwandlung in den Typ der Variablen auf der linken Seite.
Die Anweisung total += 5; erhöht eine int-Summe um 5 und speichert den geänderten Wert in total.
Zuweisung
Eine Zuweisung wertet einen Ausdruck auf der rechten Seite aus und speichert seinen Wert in der Variablen oder an einem anderen Speicherort auf der linken Seite.
Nach count = count + 2; enthält count einen um zwei größeren Wert als vor dieser Anweisung.
Zwischenwert
Ein Zwischenwert ist ein während einer Berechnung vor dem Endergebnis erzeugtes Ergebnis, das hilft nachzuvollziehen, wo ein Fehler beginnt.
Die Ausgabe des Zwischenwerts totalMinutes kann zeigen, ob eine falsche Zeitaufteilung vor der Division begonnen hat.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten