Zum Menü springen.

Aufgabe 5-2

(Übungsblatt 5)

Sind folgende Java-Anweisungen fehlerfrei zu compilieren und auszuführen? Begründen Sie Ihre Antwort.

  1. int a;a = 5;
  2. int b = 5;
  3. int c,c = 5;
  4. float d = 5,5;
  5. float e = 5;
  6. double f1 = 5d; float f2 = f1;
  7. double g1 = 5e; float g2 = g1;
  8. double h1 = 5f; float h2 = h1;
  9. long i = 0.0;
  10. float j = 0.0;
  11. float k1 = 5f; double k2 = k1;
  12. double l = 0.0;
  13. long m = (short)Integer.MAX_VALUE;
  14. short n = (long)0;

Lösungsvorschlag

zu den Teilaufgaben:

  1. Fehlerfrei: Umgestellt ist das gleichbedeutend mit dem folgenden Code-Fragment, welches offensichtlich richtig ist, weil sowohl a als auch 5 vom Typ int sind:
    int a;
    a = 5;
  2. Fehlerfrei: sowohl b als auch 5 sind vom Typ int.
  3. Nicht fehlerfrei: Umgestellt ist das gleichbedeutend mit dem folgenden Code-Fragment, welches offensichtlich syntaktisch falsch ist, weil zweimal eine Variable mit Namen c deklariert wird:
    int c;
    int c = 5;
  4. Nicht fehlerfrei: 5,5 ist kein numerischer Wert und kann folglich nicht zugewiesen werden -- d hat den Typ float, einen Kommazahlentyp. Kommazahlen in Java haben immer einen Dezimalpunkt.
  5. Fehlerfrei: 5 ist zwar vom Typ int, aber die Zuweisung eines Ganzzahl-Werts zu einer Kommazahl-Variable ist logischerweise möglich. Es kommt dann zu einer impliziten Konvertierung (Type-Cast); man sagt umgangssprachlich, die Typen float und int seien in diesem Zusammenhang zuweisungskompatibel (gilt aber nicht umgekehrt!).
  6. Nicht fehlerfrei. Die zweite Anweisung ist das Problem; in der ersten ist 5d die Zahl 5 als Wert vom Typ double völlig korrekt. Dann aber wird ein double-Wert in Form der Variablen f1 der float-Variablen f2 zugewiesen. Weil double doppelt so viele Stellen hat wie float, verbietet der Compiler diese Zuweisung. (Mit einem expliziten Type-Cast wäre es möglich, sie zu erzwingen.)
  7. Nicht fehlerfrei: 5e ist kein Wert; die nachgestellten Kürzel gibt es nur für die Typen float (f), double (d) und long (L).
  8. Nicht fehlerfrei: analog zu Teilaufgabe (f); dass in der ersten Anweisung rechts ein float-Wert steht, ändert nichts daran, dass h1 vom Typ double ist. Es findet eine transparente Typumwandlung statt, genau wie bei Teilaufgabe (e).
  9. Nicht fehlerfrei: analog zu Teilaufgabe (f); 0.0 hat den Typ double. Kommazahlen-Werte können nicht Ganzahl-Variablen zugewiesen werden, außer, man macht einen expliziten Type-Cast. Teilaufgabe (e) demonstriert den umgekehrten Fall (allerdings mit float und int).
  10. Nicht fehlerfrei: analog zu Teilaufgabe (f); 0.0 hat den Typ double, benötigt wird aber float.
  11. Fehlerfrei: float hat weniger Stellen als double, daher ist die Zuweisung kein Problem. Die zusätzlichen Stellen in double werden quasi einfach mit Nullen aufgefüllt. Vergleiche Teilaufgabe (f).
  12. Fehlerfrei: l ist vom Typ double, 0.0 ebenfalls.
  13. Fehlerfrei: Integer.MAX_VALUE hat den Wert 2147483647 (natürlich vom Typ int). Mit einem expliziten Type-Cast wie hier gezeigt ist es möglich, diesen Wert in den Typ short „hineinzupressen,“ obwohl der viel weniger Stellen hat. Alles, was nicht reinpasst, fällt dann einfach weg. Und den dann rechts resultierenden Wert vom Typ short kann man natürlich einer long-Variablen zuweisen; die zusätzlichen Stellen in long werden dann einfach mit Nullen gefüllt. (m hat übrigens hinterher den Wert-1 wegen der internen Darstellungsform negativer Zahlen. Wie man sieht, warnt der Compiler nicht ohne Grund vor „possible loss of precision.“)
  14. Nicht fehlerfrei: Rechts steht ein Wert vom Typ int, der dann noch explizit in long gecastet wird (also noch mehr Stellen bekommt). Der Typ short hat aber weniger Stellen als jeder der beiden, so dass eine Zuweisung nur mit explizitem Type-Cast zu short möglich wäre.

Anmerkung. Bei Problemen dieser Art ist das „Code Pad“ in BlueJ äußerst hilfreich. Siehe Unterlagen.

Arne Johannessen, 2. Dezember 2007