Schlechter Stil beim Exception Handling

sh33p

Bekanntes Mitglied
Java:
import java.io.*;
public class Blablubb {

  public static void main(String[] args) {
    String fn = "xyz.txt";
  FileInputStream input = null;
  try {
    input = new FileInputStream(fn);
    System.out.println("\nDatei " + fn + " geoeffnet!");
    int aValue = 0;
    while (true) {
      aValue = input.read();
      if (aValue == -1 ) {
        System.out.println("<EOF>");
        throw(new EOFException());   // Wenn beim Lesen aus einem Stream,das Ende erreicht wurde
      }
      else System.out.print((char)aValue);
    }
  }
  catch (IOException e) {}
  finally {
    if (input != null) {
      input.close();
      System.out.println("\nDatei " + fn + " geschlossen!");
    }
  }
  }
}

Ich wollte mal diskutieren was beim Exception Handling besonders schlechter Stil ist bzw. was man vermeiden sollte. Natürlich bezogen auf das Beispiel 😀
 
erster Blick:

eine auftretende IOException wird verschluckt

das Ende einer Datei wird per Exception kommuniziert
 
Moin,

was für Exception-Handling ???:L
Du handelst es doch gar nicht wirklich :lol:

Also statt
Java:
catch (IOException e) {}

minimal
Java:
catch (IOException e)
{
    e.printStackTrace();
}

Gruß
Klaus
 
Zuletzt bearbeitet:
Das catch kann man weglassen, wenn man die Ausnahme nicht behandeln will. Das finally kann auch ohne catch verwendet werden und sorgt dafür, dass der InputStream in jedem Fall geschlossen wird. An sich könnte man die Exception aber schon ausgeben, sollte dann aber entweder die EOFException gesondert fangen (und ignorieren) oder evtl. besser noch das EOF ohne Exception behandeln, denn in diesem Fall erscheint das irgendwie unnötig.
 
Ein besonders guter Stil beim Exception-Handling wäre wohl Exceptions allgemein zu vermeiden, da diese Speicher fressen und sowieso unschön sind.
An den Stellen wo sie unvermeidbar sind, jede Exception separat abfangen, um unterschiedlich reagieren zu können und beim Debugging den Suchaufwand zu verringern.
 
Hier mal eine etwas bessere Version: Wenn Fehler auftreten werden sie nicht verschluckt, außerdem werden Exceptions nicht für den Kontrollfluss verwendet.

Java:
import java.io.*;

public class Blablubb {

  public static void main(String[] args) {
    String fn = "xyz.txt";
    FileInputStream input = null;
    
    try {
      input = new FileInputStream(fn);
      System.out.println("Datei " + fn + " geoeffnet!");
      int aValue = 0;
      while ((aValue = input.read()) != -1) {
        System.out.print((char)aValue);
      }
      System.out.println("<EOF>");
      
    } catch (FileNotFoundException e) {
      System.out.println("Datei nicht gefunden: " + fn);
    } catch (IOException e) {
      System.out.println("Fehler:");
      e.printStackTrace();
      
    } finally {
      if (input != null) {
        try {
          input.close();
          System.out.println("\nDatei " + fn + " geschlossen!");
        } catch (IOException e) {
          System.out.println("Fehler:");
          e.printStackTrace();
        }
      }
    }
  }
  
}
 
Ausnahmen dienen nicht dazu, die Logik eines Programmes zu steuern. Wenn Du also sowieso EOF erkennst, ist es unnötig und schlecht, das auch noch als Ausnahme zu behandeln und auf diese Ausnahme zu reagieren.

Java:
  try {
    input = new FileInputStream(fn);
    System.out.println("\nDatei " + fn + " geoeffnet!");
    int aValue;
    while ((aValue = input.read()) != -1) {
      System.out.print((char)aValue);
    }
    System.out.println("<EOF>");
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    if (input != null) {
      input.close();
      System.out.println("\nDatei " + fn + " geschlossen!");
    }
  }

Edit: Hm, vier Stunden zu langsam. Das gibt mir jetzt schon zu denken. 😉
 
Zuletzt bearbeitet:

Zurück
Oben