Anhang

Installation von Java

Für die Entwicklung eigener Java-Programme benötigen Sie ein Java Development Kit (JDK). Eine reine Java-Laufzeitumgebung (JRE) ist hierfür nicht ausreichend, da sie keinen Compiler (javac) enthält.

Unabhängig vom verwendeten Betriebssystem sollte nach der Installation überprüft werden, ob sowohl der Java-Interpreter als auch der Compiler verfügbar sind:

java -version
javac -version

Schlägt einer dieser Befehle fehl, ist entweder kein vollständiges JDK installiert oder die Installation ist nicht korrekt in die Umgebung eingebunden.

Dokumentation

Es ist empfehlenswert, die Java-Dokumentation lokal auf dem eigenen Computer gespeichert zu haben. So kann sie auch offline gelesen werden.

Die Java-Dokumentation ist unabhängig von jeweils genutzten Betriebssystem. Sie kann bei Oracle als gepacktes ZIP-Archiv heruntergeladen werden. Die URLs zu den Dokumentationen der verschiedenen Java-Versionen variieren. Nutzen Sie die Suchmaschine Ihres Vertrauens und geben Sie folgenden Suchbegriff ein:

Java XX Documentation Download

Das XX ersetzen Sie durch die Versionsnummer der Java-Version, die Sie installieren.

Windows

Unter Windows empfiehlt sich die Installation eines OpenJDK über einen Installer, der die notwendigen Umgebungsvariablen automatisch setzen kann. Eine verbreitete und zuverlässige Variante ist von Adoptium (https://adoptium.net/de).

Installation

Installieren Sie eine aktuelle LTS-Version des JDK und achten Sie während der Installation darauf, dass folgende Optionen aktiviert sind:

Nach Abschluss der Installation öffnen Sie ein neues Terminal und prüfen die Installation:

java -version
javac -version
where java
where javac

JAVA_HOME und PATH

Falls erforderlich, kann die Variable JAVA_HOME manuell gesetzt werden.Sie muss auf das Wurzelverzeichnis des JDK zeigen, z. B.:

C:\Java\jdk-25

Der Unterordner bin dieses Verzeichnisses muss zusätzlich im PATH enthalten sein.

Hinweis zur Zeichencodierung

In älteren Java-Versionen und Konsolenumgebungen kam es unter Windows gelegentlich zu Problemen bei der Darstellung von Umlauten.

In aktuellen Systemen ist dies meist nicht mehr erforderlich. Dennoch kommt es beim Einlesen von Daten sowie bei Umlenkungen von Ein- und Ausgabe stets zu Problemen mit deutschen Umlauten. Stellen Sie daher die Codepage 65001 im Terminal ein.

chcp 65001

Sie können diese Einstellung permanent machen. Dazu richten Sie sich in der TerminalApp ein eigenes Register ein.

Die beiden folgenden Abbildungen zeigen Ihnen, wie Sie solch ein Register mit passenden Einstellungen für Java einrichten.

Windows-TerminalApp konfigurieren (1)
Windows-TerminalApp konfigurieren (1)

Windows-TerminalApp konfigurieren (2)
Windows-TerminalApp konfigurieren (2)

In seltenen Fällen kann es zudem hilfreich sein, Java explizit mit UTF-8-Encoding zu starten.

java -Dfile.encoding=UTF-8 

Linux (Ubuntu)

Unter Ubuntu kann Java direkt aus den Paketquellen installiert werden, hier für Java 21 gezeigt.

Installation

sudo apt update
sudo apt install openjdk-21-jdk

Anschließend prüfen Sie die Installation:

java -version
javac -version
which java
which javac

Mehrere Java-Versionen

Falls mehrere Java-Versionen installiert sind, kann die aktive Version mit folgendem Befehl ausgewählt werden:

sudo update-alternatives --config java
sudo update-alternatives --config javac

JAVA_HOME

In vielen Fällen ist das Setzen von JAVA_HOME nicht zwingend erforderlich. Falls jedoch Entwicklungswerkzeuge darauf angewiesen sind, kann die Variable z. B. in der Datei ~/.bashrc oder ~/.profile gesetzt werden:

export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"

macOS

Auch unter macOS ist ein vollständiges JDK erforderlich.

Installation

Am einfachsten ist Java über das von Adoptium (https://adoptium.net/de) herunterladbare Installationspaket zu installieren.

Eine alternative Möglichkeit ist die Installation über Homebrew. Nach Installation von Homebrew kann das JDK wie folgt installiert werden:

brew install --cask temurin

Nach der Installation prüfen Sie sie:

java -version
javac -version
JAVA_HOME unter macOS

macOS stellt ein eigenes Werkzeug zur Ermittlung des installierten JDK bereit:

/usr/libexec/java_home

Empfohlen ist es, JAVA_HOME dynamisch zu setzen, z. B. in der Datei ~/.zshrc:

export JAVA_HOME=$(/usr/libexec/java_home)
export PATH="$JAVA_HOME/bin:$PATH"

Dies erleichtert den Umgang mit mehreren installierten Java-Versionen.

Hinweise zu Entwicklungsumgebungen

In diesem Seminar wird bewusst keine bestimmte Entwicklungsumgebung vorausgesetzt. Unabhängig von der verwendeten IDE oder dem verwendeten Editor gilt:

Installation der pakad-Bibliothek

Die im Seminar verwendete Lehr-Bibliothek besteht aus der Bibliothek selbst und der zugehörigen Dokumentation.

Kopieren Sie die Datei PAToolsUdemy.jar, das ist die Bibliothek in ein Verzeichnis Ihrer Wahl. Setzen Sie die Systemvariable CLASSPATH. Das ist der Suchpfad für Java-Klassen.

Unter Windows wird die Variable in der Systemsteuerung unter Umgebungsvariablen gesetzt.

.;C:\Users\USERNAME\LIB\Java\PATools.jar

Unter macOS und Linux setzen Sie die Variable in Ihrer Shell-Konfigurationsdatei, beispielsweise .bashrc oder .zshrc, je nach Ihrer Systemkonfiguration:

export CLASSPATH=".:\Users\USERNAME\Lib\Java\PAToolsUdemy.jar"

Die Dokumentation ist in einem ZIP-Archiv verpackt. Entpacken Sie dies in einem Verzeichnis Ihrer Wahl.

Rekursion - Denk- und Prüfhilfe

Dieser Anhang fasst die wesentlichen Gedanken zur Rekursion kompakt zusammen. Er dient als Nachschlagehilfe beim Entwurf, Verständnis und Debugging rekursiver Methoden und ergänzt das Kapitel zur Rekursion, ohne neue Inhalte einzuführen.

Grundidee

Rekursion bedeutet, ein Problem so zu lösen, dass es auf ein gleichartiges, aber kleineres Teilproblem zurückgeführt wird.

Eine rekursive Methode arbeitet dabei nach demselben Prinzip wie eine iterative: Sie zerlegt das ursprüngliche Problem schrittweise, bis ein direkt lösbarer Fall erreicht ist.

Wichtig ist:

Eine rekursive Methode beschreibt nicht den gesamten Ablauf auf einmal, sondern lediglich einen einzelnen Schritt sowie den Übergang zum nächsten, kleineren Problem.

Das Rekursions-Rezept

Jede korrekt aufgebaute rekursive Methode erfüllt die folgenden vier Punkte:

  1. Abbruchbedingung (Basisfall) Ein Fall, für den das Ergebnis unmittelbar bekannt ist und kein weiterer rekursiver Aufruf erfolgt.
  2. Rekursionsschritt Das ursprüngliche Problem wird auf ein kleineres oder einfacheres Teilproblem zurückgeführt.
  3. Fortschritt Bei jedem rekursiven Aufruf wird garantiert, dass der Basisfall näher rückt.
  4. Vertrauen Es genügt, den nächsten Schritt korrekt zu formulieren. Die rekursive Methode funktioniert für das Teilproblem nach denselben Regeln.

Fehlt einer dieser Punkte, ist die rekursive Lösung fehlerhaft.

Typische Rekursionsmuster

In der Praxis lassen sich rekursive Methoden häufig einem der folgenden Muster zuordnen:

Lineare Rekursion

Baumrekursion

Strukturrekursion

Rekursion und Aufrufstack

Jeder Methodenaufruf wird zur Laufzeit auf einem Aufrufstack verwaltet. Auch rekursive Methoden erzeugen bei jedem Aufruf einen neuen Stack-Eintrag mit eigenen Parametern und lokalen Variablen.

Der Ablauf lässt sich vereinfacht wie folgt beschreiben:

Häufige Fehler und ihre Ursachen

Treten Probleme bei rekursiven Methoden auf, lassen sie sich häufig auf einen der folgenden Punkte zurückführen:

Rekursion ist kein Selbstzweck. Sie ist dann besonders geeignet, wenn sie die Struktur des Problems auf natürliche Weise widerspiegelt.