info@a-coding-project.de

Java: Fehlerbehandlung

Bei Fehlern, die das Programm erst während der Laufzeit bemerkt, stürzt es leicht mit Fehlermeldungen ab, die unverständlich oder nichtssagend sind. Fehlerbehandlungsroutinen können in solchen Fällen für eine verständliche Meldung sorgen oder sogar dafür, dass das Programm sinnvoll weitermacht.
Es gibt 2 Arten von Fehlern: Syntaxfehler und Laufzeit-Fehler. Syntaxfehler sind meist Schreibfehler des Programmierers. Sie werden schon vom Compiler abgewiesen: Die Compilierung wird mit der Fehlermeldung "Syntaxfehler..." abgewiesen. Das Programm kann nicht compiliert und damit auch nie ausgeführt werden.
Anders ist es mit Laufzeitfehlern. Das Programm ist formal richtig, wird deshalb compiliert und gestartet, aber während der Laufzeit tritt ein Problem auf, das Java nicht lösen kann, beipielsweise wenn eine Datei gelesen werden soll, die nicht existiert oder, wie in unserem Beispiel, keine Schachtel mehr da ist, in welche die Autos gepackt werden können. Ohne Fehlerbehandlung würde das Programm mit einer meist unverständlichen Meldung abstürzen. Eleganter wäre es, wenn statt dessen eine Meldung erscheint: "Die Datei existert nicht." Oder "Es ist keine Schachtel mehr da.", und dann wird das Programm ordentlich beendet. Dafür gibt es Fehlerbehandlungsroutinen. Jede höhere Programmiersprache bietet sie an, und in Java gibt es sie als "Exceptions" mit den Schlüsselwörtern try-catch-finally.

try-catch-finally

Mit try wird Java gesagt, dass es versuchen soll, den folgenden Anweisungsblock auszuführen. Passiert dabei ein Laufzeitfehler, dann soll die Exception ausgeführt werden, die bei catch angegeben ist. finally ist optional, aber die finally-Anweisungen werden in jedem Fall ausgeführt.

try
{
  NimmAutos(3);
}
catch ( Exception e )
{
  Meldung("Ich kann keine Autos nehmen");
}

In unserem Beispiel versucht der Roboter, 3 Autos zu nehmen. Wenn das nicht gelingt, z.B. weil keine Autos mehr daliegen, wird in die Exception e verzweigt, die immer ausgeführt wird, wenn kein anderer Fehler spezifiziert ist. Anstelle der Exception e kann man auch mit finally arbeiten. Das finally wird auf jeden Fall ausgeführt:

try
{
  NimmAutos(3);
}
finally
{
  Meldung("Hier mache ich weiter, egal was passiert");
}

throw(s)

Im Kopf einer Methode, von der man befürchten muss, dass sie einen Fehler auslöst, kann man eine throws-Klausel angeben. Sie bewirkt, dass der Fehler nicht in dieser Methode, sondern in der aufrufenden Methode behandelt wird:

void NimmAutos (int AnzahlAutos) throws Exception e
{
  Anweisungen;
}

Auf diese Weise kann die Fehlerbehandlung "von unten nach oben" von einer Methode an die jeweils aufrufende "durchgereicht" werden, solange, bis eine Methode erreicht wird, in welcher der Fehler sinnvoll behandelt wird.
Exceptions kann man auch selbst erzeugen. Dazu dient das Schlüsselwort throw (ohne s, im Gegensatz zu oben): Wenn die Funktion NimmAutos() fehlschlägt, soll Java die Exception MeineException "werfen":

if ( ! NimmAutos(3))
{
  throw new MeineException ("Ich kann keine Autos nehmen");
}

Weiterlesen: ⯈ Funktionen

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant