Java-Ausnahmen Behandeln Sie sie richtig?

Java-Ausnahmen Behandeln Sie sie richtig? / Programmierung

Eine Ausnahme bei der Programmierung bedeutet, dass zu einem bestimmten Zeitpunkt während der Programmausführung ein Ausnahmezustand vorliegt. Es wird verwendet, wenn der außergewöhnliche Zustand anderswo besser gehandhabt werden kann als dort, wo er angetroffen wird. Betrachten Sie die folgenden Beispiele:

  • Ein Fehler beim Öffnen einer Konfigurationsdatei kann im oberen Bereich des Codes besser gehandhabt werden, z. B. durch Verwendung eines alternativen Speicherorts für Konfigurationsdateien.
  • Zugreifen auf ein Arrayelement Verwendung einer Java-ArrayList Verwendung einer Java-ArrayList Eine Java-Arrayliste ist ein allgemein anpassbares Array. Es bietet die meisten Einrichtungen, die normalerweise von Arrays in anderen Sprachen erwartet werden. In diesem Artikel erfahren Sie, wie Sie eine Arrayliste einrichten und verwenden. Mehr lesen außerhalb der Grenzen des Arrays weist auf einen Programmfehler hin. Viel Spaß beim Debuggen!
  • Ein XML-Analysefehler sollte dem Benutzer zur Kenntnis gebracht werden, damit die XML-Datei korrigiert werden kann.
  • Das Programm, dem der Speicher ausgeht (möglicherweise beim Verarbeiten einer großen Datei), kann behoben werden, indem möglicherweise der für den Java-Prozess verfügbare Speicher erhöht wird.

In all diesen Fällen (und mehr) sollte die Ausnahme außerhalb des Speicherorts behandelt werden, an dem sie generiert wird, damit die zugrunde liegende Ursache behoben werden kann.

Arten von Ausnahmen

Das Bild unten zeigt die Hauptteile der Java-Ausnahmehierarchie. Die Basisklasse ist Wurffähig das ist in untergeordnet Ausnahme und Error. Klasse Ausnahme ist für programmbezogene Bedingungen, die von Anwendungen beim Versuch, die Situation zu retten, verfangen können. Klasse Error, Auf der anderen Seite gibt es zum Anzeigen schwerwiegender Fehler in der Java-Laufzeitumgebung, welche Anwendungen nicht fangen sollten. Einige Beispiele sind: Außerhalb des Speicherfehler und StackOverflowError.

Ein Ausnahme Wieder gibt es zwei Arten: geprüft und nicht geprüft. Eine geprüfte Ausnahme muss vom aufrufenden Code behandelt werden. Diese Regel wird vom Java-Compiler durchgesetzt. Eine ungeprüfte Ausnahme kann dagegen in der Anrufkette propagiert werden, ohne dass sie explizit deklariert werden muss. Die folgenden Beispiele werden klarer.

Geprüfte Ausnahmen

Die folgende Methode versucht zu erstellen FileReader aus einer Datei. Der Konstruktor löst eine geprüfte Ausnahme aus FileNotFoundException die vom aufrufenden Code gehandhabt oder zum Abwurf erklärt werden müssen.

Der folgende Code wird nicht kompilieren, da es auch nicht geht.

private void loadFile (String dateiname) FileReader in = new FileReader (Dateiname);  

Eine Möglichkeit, den zu kompilierenden Code zu erhalten, besteht darin, die Ausnahme zu behandeln (siehe unten)..

private void loadFile (String dateiname) try FileReader in = new FileReader (Dateiname));  catch (FileNotFoundException ex) // Ausnahme hier behandeln 

Wenn die Ausnahme nicht direkt vom Aufrufer behandelt werden kann, muss sie in der Methodensignatur deklariert werden.

private void loadFile (String dateiname) wirft java.io.FileNotFoundException FileReader in = new FileReader (Dateiname));  

Ungeprüfte Ausnahmen

Eine ungeprüfte Ausnahme ist eine, von der aus eine Unterklasse erstellt wird RuntimeException und muss nicht direkt behandelt oder wie oben erklärt werden. Der folgende Code führt beispielsweise zu einem NullPointerException, was ist eine Art von RuntimeException. Der Code wird jedoch seitdem fehlerfrei übersetzt NullPointerException ist eine ungeprüfte Ausnahme.

private void handleEvent () Stringname = null; if (name.length ()> 0)  

Ausnahmen umwickeln

Angesichts der obigen Diskussion über geprüfte und ungeprüfte Ausnahmen scheint es einfacher zu sein, mit ungeprüften Ausnahmen umzugehen, da Sie sie nicht selbst deklarieren oder selbst behandeln müssen. In Anbetracht dieser Bequemlichkeit kann es manchmal nützlich sein, eine geprüfte Ausnahme in eine ungeprüfte Ausnahme zu packen.

Das folgende Codebeispiel zeigt, wie eine Ausnahme umbrochen wird. Die Methode Methode 1() wirft ein SQLException in seinem Körper. Damit der Code korrekt kompiliert werden kann, muss die Ausnahme als ausgelöst deklariert werden.

private void method_1 () wirft SQLException … wirft neue SQLException;  

Wenn diese Methode von einer anderen Methode aufgerufen wird (method_2 ()), diese Methode kann die SQLException und wickeln Sie es in eine ungeprüfte Ausnahme ein, sodass die Ausnahme nicht in der Methodensignatur angegeben werden muss.

private void method_2 () try method_1 ();  catch (java.sql.SQLException ex) Neue RuntimeException (Ex) werfen;  

Ausnahme-Stack-Trace

Ein Ausnahme-Stack-Trace bezieht sich auf das Array aktiver Stack-Frames, von denen jeder einen Methodenaufruf darstellt, der von der JVM zu dem Zeitpunkt erfasst wurde, zu dem die Ausnahme ausgelöst wurde. Jeder Stack-Frame enthält die Position des Methodenaufrufs, einschließlich Klassenname, Methodenname und möglicherweise den Namen der Java-Quelldatei und die Zeilennummer in der Datei. Es ist hilfreich, um die Folge von Aufrufen zu verfolgen, die den Fehler verursacht haben. Java-Ausnahmen: Behandeln Sie sie richtig? Java-Ausnahmen: Behandeln Sie sie richtig? Eine Ausnahme bei der Programmierung bedeutet eine außergewöhnliche Bedingung bei der Programmausführung. Es wird verwendet, wenn der Zustand anderswo besser gehandhabt werden kann. Beachten Sie die folgenden Beispiele für die Behandlung von Java-Ausnahmen. Weiterlesen .

Hier ist ein typischer Stack-Trace, der aus dem Ausnahmeobjekt stammt, als er abgefangen wurde.

Ausnahme im Thread "main" java.lang.IndexOutOfBoundsException: Index: 8, Größe: 5 at java.util.ArrayList.rangeCheck (ArrayList.java:653) at java.util.ArrayList.get (ArrayList.java:429) um sample.sample1.main (sample1.java:24) 

Die Ausnahme ist hier gefangen IndexOutOfBoundsException. Es enthält zusätzliche Informationen zum Fehler. Die Stack-Ablaufverfolgung enthält 3 Stack-Frames, von denen jeder die Standortinformationen wie gezeigt enthält.

Umgang mit Ausnahmen

Eine Ausnahme kann behandelt werden, indem Sie sie in a einfangen Try-Catch blockieren und alle erforderlichen Korrekturmaßnahmen ergreifen. Das Ausnahme object bietet mehrere Methoden zum Extrahieren von Informationen über die Bedingung, die es verursacht hat.

Der folgende Code protokolliert die Fehlermeldung in einer Protokolldatei.

private void loadConfig () try // Code aufrufen, der eine IOException erzeugen kann catch (java.io.IOException ex) // Hier wird eine Ausnahme behandelt. Kann in einer Protokolldatei protokolliert werden. log.warning (ex.getMessage ());  

Wenn eine Ausnahme in eine andere umschlossen ist, können Sie die umschlossene Ausnahme abrufen:

Auslösbare Ursache = ex.getCause (); log.warning ("zugrundeliegende Ursache:") + cause.getMessage ()); 

Müssen Sie auf die Stack-Ablaufverfolgung zugreifen und möglicherweise den Namen der Methode extrahieren, die sie verursacht hat?

StringBuilder sbuf = neuer StringBuilder ("Stack Trace:"); for (StackTraceElement el: ex.getStackTrace ()) sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n");  log.warning (sbuf.toString ()); 

Oder protokollieren Sie die Ausnahme und führen Sie sie erneut aus?

try … catch (java.io.IOException ex) log.warning (ex.getMessage ()); ex werfen;  

Das Ausnahme Klasse bietet ein printStackTrace () Methode, die den Stack-Trace auf Ihre eigene drucken kann PrintStream (oder PrintWriter).

try … catch (java.io.IOException ex) PrintStream out =…; out.println (ex.getMessage ()); ex.printStackTrace (out);  

Sie können mehrere Ausnahmetypen in einer einzigen Ausnahme erfassen Versuchen sperren und spezifische Behandlung für jeden Ausnahmetyp durchführen.

try // wirft hier einige Ausnahmen catch (java.io.IOException ex) // IOException-spezifische Behandlung hier catch (java.sql.SQLException ex) // SQLException-spezifische Behandlung hier 

Um mehrere Ausnahmetypen abzufangen, aber denselben Behandlungscode zu verwenden, können Sie einen deklarieren Fang Block mit mehreren Typen wie folgt:

try // löst hier einige Ausnahmen aus catch (java.io.IOException | java.sql.SQLException ex) // IOException- und SQLException-spezifische Behandlung hier catch (SAXException ex) // SAXException-spezifische Behandlung hier 

Ressourcen bereinigen mit abschließend

Beim Umgang mit Code, der Ausnahmen auslösen kann, ist es wichtig, alle Ressourcen ordnungsgemäß zu bereinigen, z. B. geöffnete Dateien. Alles, was Sie über Dateiformate und ihre Eigenschaften wissen müssen. Alles, was Sie über Dateiformate und deren Eigenschaften wissen müssen. Wir verwenden das Wort Datei austauschbar: Musik, Bilder, Tabellenkalkulation, Diashow usw. Aber was macht eine Datei überhaupt zu einer "Datei"? Versuchen wir, diesen grundlegenden Teil des Computers zu verstehen. Weitere Informationen, Datenbankverbindungen usw. Die Ressourcenbereinigung sollte in a durchgeführt werden endlich Block. Auf diese Weise rufen sowohl der normale Exit als auch der außergewöhnliche Exit eines Blocks den Bereinigungscode auf. Die 10 schlechtesten Programmierfehler in der Geschichte Die 10 schlechtesten Programmierfehler in der Geschichte In seiner Vergangenheit hat auch das Codieren die Zerstörung bewirkt. Instanzen von etwas schlechtem Code führten auf einer großen Ebene zu einer Katastrophe. Das Folgende sind 10 der schlimmsten Programmierfehler in der Geschichte. Weiterlesen .

InputStream in = null; try … in = new FileInputStream (Dateiname);… catch (java.io.IOException ex) log.warning (ex.getMessage ());  Schließlich // Code hier wird beim Verlassen des try-Blocks ausgeführt, // ob normalerweise oder aufgrund einer Ausnahme if (in! = null) in.close ();  

Try-With-Resources-Block

Java 1.7 führte die Try-With-Ressourcen Konstrukt, das die Bereinigung der Ressource vereinfacht. Es sieht aus wie das:

try (InputStream in = new FileInputStream (…)) // Code, der den InputStream verwendet.  

Wenn der Code den Block verlässt (ob sauber oder aufgrund einer Ausnahme), wird der Eingabestrom Variable wird automatisch bereinigt.

Bereinigen Sie mehrere Ressourcen, indem Sie alle im Blockkopf deklarieren.

try (InputStream in = new FileInputStream (…); Connection con =…;) // Code, der den InputStream und die Verbindung verwendet.  

Jedes Objekt, dessen Klasse das implementiert AutoCloseable Schnittstelle kann auf diese Weise bereinigt werden. Die folgende Klasse führt eine bestimmte Bereinigung im aus schließen() Methode.

public class MyClass implementiert AutoCloseable public void close () // Hier den Bereinigungscode 

Verwenden Sie eine Instanz dieser Klasse in a Try-With-Ressourcen Block.

try (MyClass obj = neue MyClass (…)) // Code, der das MyClass-Objekt verwendet.  

Einige häufig angetroffene Ausnahmen

Betrachten wir nun einige häufig anzutreffende Ausnahmen.

  • IndexOutOfBoundsException (nicht markiert): Gibt an, dass der Index des Elements, auf das zugegriffen wird, außerhalb der Grenzen eines Arrays, einer Zeichenfolge usw. liegt.
  • SQLException (angehakt): Wurde aufgrund eines Datenbankfehlers ausgelöst.
  • IOException (geprüft): Dateizugriffsfehler oder Fehler in Bezug auf Eingabe und Ausgabe.
  • InterruptedException (angehakt): Wird ausgelöst, wenn eine Thread-Ausführung unterbrochen wird.
  • SAXException (angehakt): Wird aufgrund von XML-Analysefehlern ausgelöst.
  • NullPointerException (nicht markiert): Verwendung von null, wenn ein Objekt erforderlich ist.

Einpacken

Ausnahmen sind die Hauptmethode für die Fehlerberichterstattung und -verwaltung in Java. Die richtige Verwendung von Ausnahmen verbessert die Codequalität. Schreiben oder schneller Code in Ihrem Linux-Texteditor mit benutzerdefinierten Designs. Schreiben oder Code schneller in Ihrem Linux-Texteditor. Mit benutzerdefinierten Designs. Warum optimieren Sie es nicht, um Ihre Produktivität zu steigern, egal ob Sie Skripts erstellen und codieren oder das Tool als Markup-Editor verwenden? Lesen Sie mehr und helfen Sie bei der Lösung von Problemen in der Produktion.

Haben Sie Kriegsgeschichten, die sich auf Ausnahmen beziehen? Wenn ja, erzählen Sie uns im Kommentarbereich weiter unten.

Bildnachweis: Dmitry Nikolaev über Shutterstock.com

Erfahren Sie mehr über: Java, Programmierung.