Kleines Nachschlagewerk Informatik
Fehlerbehandlung
Worum geht es?
Hier geht es nicht um Programmierfehler, sondern um Fehler, die ein Anwender machen kann und auf die man reagieren muss. Das Programm muss also mit unvorhorgesehenen Situationen (fehlende Dateien, falsche Eingaben etc.) zurecht kommen.
Messageboxen
Wenn ein Fehler auftritt, muss der Anwender darüber informiert werden. Diese Ausgaben kann man in Labels oder Textfelder darstellen, sinnvoller sind aber kleine Fenster, die sogenannten Message-Boxen.

      JOptionPane.showMessageDialog(null, "Du hast keine Zahl eingegeben!");
            
Diese werden einfach mit einem Klick auf OK quittiert.
Ausgaben in die Konsole
Ausgaben in die Konsole kann man mit println erledigen:

      System.out.println("Do hast keine Zahl eingegeben");
            
Ist dies bei der Fehlersuche ein gutes Mittel, sollte man es für die Information des Anwenders nur verwenden, wenn es sich um ein Konsolenprogramm handelt. Arbeitet das Programm so wie gewohnt mit Fenstern, sieht der Anwender diese Ausschriften oft nicht!
Rückgabewerte
Die einfachste Art anzugeben, ob eine Routine ein richtiges Ergebnis berechnen konnte, ist die Wahl des Rückgabewertes.

Man kann zum einen nur Fehlercode als Rückgabe definieren.

      int berechneIrgendwas()
      {
          int rueckgabewert;
          // Hier folgen Berechnungen.
          // Dabei wird die Variable rueckgabewert gesetzt.
          return rueckgabewert;
      }
            
Man kann nun definieren, dass 0 als Rückgabewert "alles ok" meint, und Zahlen ungleich 0 verschiendene Fehlercodes sind. Erfahrene Programmierer verwenden hierfür Enumerations (siehe enum).

Wenn man den Rückgabewert aber schon benötigt, dann ist es oftmals möglich, spezielle Werte als Fehler zu nutzen. Sind als Ergbnis einer Berechnung nur positive Werte erlaubt, so können negative Werte als Fehlercodes dienen. Wird ein Objekt (z.B. eine Zeichenkette) erwartet, kann null (also ein Verweis ins Leere) als Fehler interpretiert werden.
try-catch-Blöcke
Die Arbeit mit Rückgabewerten ist nicht sehr elegant, vor allem bei vielen verschachtelten Aufrufen von Routinen wird der Quelltext schnell unübersichtlich. Eine schöne, aber nicht ganz simple Art ist das try-catch-Konstrukt. Hierbei wird ein Block definiert, in dem die Programmausführung "versucht" wird und ein Block, der abgearbeitet wird, wenn dies schief gegangen ist.

      try
      {
          // Hier steht der Code, der schief gehen kann (Umwandlung
          // einer Zahl, Öffnen einer Datei etc.)
      }
      catch (Exception e)
      {
          // Egal, an welcher Stelle im try-Block etwas schief geht, Java
          // springt hierher. Hier werden dann z.B. Fehlermeldungen
          // ausgegeben.
      }
            
Da try-catch-Blöcke die bevorzugte Art der Fehlerbehandlung in Java sind, erzwingen viele Dinge derartige Konstrukte (z.B. kann man Dateien nur innerhalb eines try-catch-Blockes öffnen).

Ausblick: Da im try-Block verschiedene Fehler, werden auch verschiedene Ausnahmen "geworfen", auf die man in separaten catch-Blöcken reagieren kann. Dies führt aber an dieser Stelle zu weit.