Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 7 Exceptions
gp 7.1 Problembereiche einzäunen
gp 7.1.1 Exceptions in Java mit try und catch
gp 7.1.2 Eine Datei auslesen mit RandomAccessFile
gp 7.1.3 Ablauf einer Ausnahmesituation
gp 7.1.4 Wiederholung kritischer Bereiche
gp 7.1.5 throws im Methodenkopf angeben
gp 7.1.6 Abschließende Arbeiten mit finally
gp 7.1.7 Nicht erreichbare catch-Klauseln
gp 7.2 Die Klassenhierarchie der Fehler
gp 7.2.1 Die Exception-Hierarchie
gp 7.2.2 Oberausnahmen fangen
gp 7.2.3 Alles geht als Exception durch
gp 7.2.4 Ausnahmen, die nicht aufgefangen werden müssen: RuntimeException
gp 7.2.5 Harte Fehler: Error
gp 7.3 Werfen eigener Exceptions
gp 7.3.1 Typecast auf ein null-Objekt für eine NullPointerException
gp 7.3.2 Neue Exception-Klassen definieren
gp 7.4 Rückgabewerte bei ausgelösten Ausnahmen
gp 7.5 Stack-Aufruf analysieren
gp 7.6 Assertions
gp 7.6.1 Assertions in eigenen Programmen nutzen
gp 7.6.2 Assertions aktivieren
gp 7.6.3 Assertion-Nutzung in den Sun-Quellen
gp 7.7 Sicherheitsfragen mit dem SecurityManager klären
gp 7.7.1 Programm beenden


Galileo Computing

7.4 Rückgabewerte bei ausgelösten Ausnahmentoptop

Java versucht, durch Flussanalyse den Programmablauf innerhalb einer Methode zu bestimmen und zu melden, ob definitiv ein Rückgabewert geliefert wird. Dabei werden die Programmpfade verfolgt und Ausdrücke unter Umständen ausgewertet. Doch die Aussage »Jede Funktion mit Ergebnistyp ungleich void muss eine return-Anweisung besitzen« müssen wir etwas relativieren. Nur in einem speziellen Fall müssen wir dies nicht. Nämlich genau dann, wenn vor dem Ende der Funktion eine throws-Anweisung die Abarbeitungsreihenfolge beendet. Sehen wir uns drei Methoden an:

Listing 7.11 NoReturn.java

class NoReturn
{
  int foo()
  {
    throw new RuntimeException();
  }
  void bar()
  {
    if ( true )
      throw new RuntimeException();
  }
  int zof()
  {
    if ( true )    // while würde stattdessen gehen!
      throw new RuntimeException();
  }
}

Ein Blick auf foo() verrät, dass trotz Rückgabewert keine return-Anweisung eingesetzt wird. Die Abarbeitung wird vor dem Rücksprung durch eine Exception abgebrochen. foo() muss diese Exception nicht mit throws ankündigen, da wir wieder ein Exemplar von RuntimeException erzeugen. Bei bar() führt nur eine wahre Bedingung zu einem Abbruch. Da if(true) immer wahr ist, wird die Methode mit einer Exception beendet. Einen Rückgabewert haben wir nicht, daher ist es egal, ob wir ein return einsetzen oder nicht. Interessanter ist da schon die Methode zof(). Wie bei foo() haben wir einen vorgeschriebenen Rückgabewert, aber eine Exception soll dies überflüssig machen. In unseren Gedanken wird if(true) immer ausgeführt und die Exception immer ausgelöst, wie im Fall bar(). Das erkennt der Compiler allerdings nicht und meckert darüber, eine return-Anweisung einzusetzen. Die Flussanalyse geht nicht so weit, den konstanten Ausdruck auszuwerten. Paradoxerweise würde ein while(true) hier funktionieren und auch zof() übersetzungsfähig machen.





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de