Donnerstag, 19. April 2012

Anderen die Fehler zuschieben: "throws"

Es ist wie im richtigen Leben, der eine macht Fehler und schiebt die Verantwortung dem anderen zu. Was im wirklichen Leben moralisch zweifelhaft ist, ist in Java durchaus gängige Praxis.

Eine Methode oder Klasse kann selbst auf eine Fehlerbehandlung verzichten, wenn Fehler mit "throws" an die übergeordnete Klasse oder Instanz weitergereicht oder besser "geworfen" werden.


In unserem Beispiel haben wir eine Klasse, der ein String übergeben wird.
Wir provozieren einen Fehler wenn der Wert "null" ist. Ist der Wert hingegen "Fehler", dann erzeugen wir mit "throw" (nicht mit "throws" zu verwechseln) künstlich einen eigenen Fehler. Selbst das "Fehler machen" will gelernt sein.

class Fehler {
  public void wirfFehler(String s) throws Exception {

      s.equals("provoziere Fehler wenn s null ist");
      if (s.equals("Fehler")) {
        throw new Exception("Mein eigener Fehler");
      }
  }
}
Tritt in der Methode ein Fehler auf, wird er mit "throws" an die aufrufende Stelle zurückgegeben, bzw. geworfen um in der verwendeten Sprache zu bleiben.

Wir können aber trotzdem einen "try"-Block aufbauen: Den "catch"-Block können wir wegen unseres "throws" getrost weglassen - oder alternativ nur speziellere Fehler abfangen: "throws" wirft dann nur Fehler weiter, die noch nicht behandelt wurden. Sinn machen kann aber auf jeden Fall ein optionaler "finally"-Block. Eine nette Spielerei.
class Fehler {
  public void wirfFehler(String s) throws Exception {

    try{
      s.equals("provoziere Fehler wenn s null ist");
      if (s.equals("Fehler")) {
        throw new Exception("Mein eigener Fehler");
      }
      System.out.println("Offenbar kein Fehler");
      
    }finally{
      System.out.println("Ende der Funktion ist erreicht");
    }

  }
}
Unsere aufrufende Klasse wollen wir nicht unterschlagen.

class FehlerBehandlung {
  public static void main(String[] args) {

    String[] meldungen = new String[3];
    meldungen[0] = "irgendetwas";
    meldungen[2] = "Fehler";

    for (String wert : meldungen) {
      try {
        Fehler meinFehler = new Fehler();
        meinFehler.wirfFehler(wert);

      } catch (NullPointerException f) {
        System.out.println("Null Fehler: " + f.getClass());
        System.out.println("Nachricht: " + f.getMessage());

      } catch (Exception e) {
        System.out.println("Allgemeiner Fehler: " + e.getClass());
        System.out.println("Nachricht: " + e.getMessage());

      } finally {
        System.out.println("Element fertig\n");
      }
    }
  }
}
Das war es auch schon. Einzige bitte bei "catch" darauf achten, dass allgemeinere Abfragen auf einen Fehler immer hinter den spezielleren Fehlermeldungen aufgeführt werden - ansonsten führt dies selbst zu einem Fehler.

Keine Kommentare:

Kommentar veröffentlichen