Errata und Updates zum Buch »Java — Der Grundkurs« (2. Auflage 2018)

Java 10

»Java — Der Grundkurs« (2. Auflage 2018) ist aktuell zu Java 9. Angesichts des nun halbjährlichen Release-Zyklus von Java (siehe Java-Versions-Wahnsinn) ist es unmöglich, den Grundkurs mit jedem Release zu aktualisieren.

Die gute Nachricht ist, dass Java 10, soweit es die Beispielprogramme aus meinem Buch betrifft, zu 100% kompatibel zu Java 9 ist. (Sollten Sie doch Probleme feststellen, senden Sie mir bitte eine kurze E-Mail.)

Die wichtigste Neuerung in Java 10 heisst Local-Variable Type Inference: Sie können die meisten Variablen nun mit var deklarieren. Der Compiler erkennt selbst den richtigen Typ. Einige Beispiele dafür finden Sie im Blog-Beitrag Java 10.

Bei den IntelliJ-IDEA-Beispielprojekten zum Buch ist Java 9 als JDK eingestellt. Wenn Sie auf Ihrem Rechner Java 10 oder eine neuere Version installiert haben, müssen Sie IntelliJ mitteilen, dass Sie diese Java-Version benutzen möchten. Dazu laden Sie zuerst das Projekt und führen dann File/Project Structure aus und stellen als Projekt SDK Java 10 ein. Wenn Java 10 nicht zur Auswahl steht, klicken Sie auf New und wählen den Installationspfad zur JDK aus.

Projekteinstellungen für Java 10
Java 11

Für Java 11 gibt im Prinzip alles, was oben bereits gesagt wurde. Die wichtigsten Neuerungen habe ich wieder in einem Blog-Beitrag zusammengefasst.

Eine wesentliche Änderung betrifft allerdings das Kapitel 17: JavaFX ist nicht mehr Teil des offiziellen Java Development Kits (JDK) und muss extra installiert werden. Wenn Sie JavaFX-Programme manuell kompilieren und ausführen, müssen Sie an java und javafx zusätzliche Parameter übergeben. Wenn Sie mit IntelliJ arbeiten, müssen Sie den Ort der JavaFX-Dateien bei den Projekteinstellungen angeben. Zum Ausführen des Programms ist außerdem eine zusätzliche Option in der Run/Debug Configuration erforderlich. Details und Screenshots finden Sie im schon erwähnten Blog-Beitrag.

Sie müssen diese Einstellungen selbst vornehmen. Da jeder Benutzer die JavaFX-Bibliotheken installieren kann wohin er/sie will, ist es unmöglich, ein IntelliJ-Projekt zu erstellen, dass plattformübergreifend funktioniert. Aktualisierte Beispieldateien würden dieses Problem nicht lösen. Einsteiger-freundlich ist all das leider nicht.

Seite 125, Arrays initialisieren

Im Listing »Array initialisieren« fehlt im Buch vor [i][j] der Variablenname x. Richtig sieht der Code so aus:

// Schleifenvariante 1: Array initialisieren
for(int i=0; i<x.length; i++) {
  for(int j=0; j<x[i].length; j++) {
     x[i][j] = i + j;
  }
}
Seite 170, Calendar-Beispiel

In der letzten Code-Zeile ist das Datum 5.5.2017 angegeben. Tatsächlich liefert das Beispiel aber den 3.5.2017.

Calendar c = Calendar.getInstance(); //  z. B. 10.2.2017
c.set(Calendar.DAY_OF_MONTH, 28);    //   -->  28.2.2017
c.add(Calendar.DAY_OF_MONTH, 3);     //   -->   3.3.2017
c.roll(Calendar.MONTH, 14);          //   -->   3.5.2017 <-- korrigiert
Seite 247, Generalisierung

In der 2. Zeile des Beispiel-Codes auf S. 247 mitte fehlt der Casting-Operator (C1), damit der Compiler weiß, dass er obj3 als Objekt der Klasse C1 betrachten soll:

obj3.x1(); obj4.x2();            // nicht erlaubt 
C1 obj5 = (C1)obj3; obj5.x1();   // OK
          ^^^^
((C2)obj4).x2();                 // auch OK

Seite 278, Upper Bounded Wildcards

In der Mitte des Listings sollte statt outputTriplet natürlich sumTriplet stehen, also:

Double result = sumTriplet(t2);
Seite 297, Listing Predicate-Schnittstelle

Im Listing am Beginn der Seite ist das Wort ‚More‘ enthalten, dass dort nichts verloren hat. Das Listing sieht korrekt so aus:

@FunctionalInterface
public interface Predicate<T> {
  boolean test(T t);
  ... sowie diverse Defaultmethoden
}
Seite 316, descendingIterator-Methode

Im Listing auf S. 316 unten wird die Methode decendingIterator gezeigt, um eine Schleife in umgekehrter Reihenfolge zu durchlaufen. Diese Methode steht allerdings nicht allgemein für Sets, sondern nur für TreeSets zur Verfügung. Sie kann daher nur nach einem Cast in diesen Typ angewendet werden. Das Listing sieht korrekt so aus:

// Schleife in umgekehrter Reihenfolge
TreeSet<Point> ts = (TreeSet) set;
for(Iterator<Point> pit = ts.descendingIterator();
    pit.hasNext(); ) {
  Point p = pit.next();
  System.out.println(p.x + " " +  p.y);
}
Seite 340, Listing unteres Drittel

Anstelle von Files.createDirectory(v23) muss es Files.createDirectories(v23) lauten, weil ein Verzeichnis und ein darin enthaltenes Unterverzeichnis erzeugt werden. (In den Beispieldateien ist der Code korrekt.)

Letzte Änderung am 28.11.2018. Vielen Dank an alle Leser und Leserinnen für das Feedback!