Werbung

Eine Ausnahme bei der Programmierung bedeutet eine Ausnahmebedingung zu einem bestimmten Zeitpunkt in der Programmausführung. Es wird verwendet, wenn der Ausnahmezustand anderswo besser behandelt werden kann als dort, wo er auftritt. Betrachten Sie die folgenden Beispiele:

  • Wenn eine Konfigurationsdatei nicht geöffnet wird, kann dies besser im Code behandelt werden, möglicherweise mithilfe eines alternativen Speicherorts für die Konfigurationsdatei.
  • Zugriff auf eine Array-Element So verwenden Sie eine Java ArrayListEine Java-Arrayliste ist ein Allzweck-Array mit veränderbarer Größe. Es bietet die meisten Funktionen, die allgemein von Arrays in anderen Sprachen erwartet werden. In diesem Artikel erfahren Sie, wie Sie eine Arrayliste einrichten und verwenden. Weiterlesen außerhalb der Grenzen des Arrays bedeutet einen Programmfehler. Viel Spaß beim Debuggen!
  • Ein XML-Parsing-Fehler sollte dem Benutzer gemeldet werden, damit die XML-Datei korrigiert werden kann.
  • Das Programm, dem der Speicher ausgeht (möglicherweise bei der Verarbeitung einer großen Datei), kann korrigiert 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 folgende Bild zeigt die Hauptteile der Java-Ausnahmehierarchie. Die Basisklasse ist Werfen welches in unterteilt ist Ausnahme und Error. Klasse Ausnahme ist für programmbezogene Bedingungen gedacht, die Anwendungen erfassen können, um die Situation zu retten. Klasse ErrorAuf der anderen Seite werden schwerwiegende Fehler in der Java-Laufzeitumgebung angezeigt, die von Anwendungen nicht abgefangen werden sollten. Einige Beispiele sind: Außerhalb des Speicherfehler und StackOverflowError.

Ausnahmehierarchie

Ein Ausnahme Es gibt wieder zwei Arten: aktiviert und deaktiviert. Eine aktivierte Ausnahme muss vom aufrufenden Code behandelt werden. Diese Regel wird vom Java-Compiler erzwungen. Eine ungeprüfte Ausnahme kann dagegen in der Aufrufkette weitergegeben werden, ohne dass sie explizit deklariert werden muss. Die folgenden Beispiele werden dies verdeutlichen.

Überprüfte Ausnahmen

Die folgende Methode versucht zu erstellen FileReader aus einer Datei. Der Konstruktor löst eine aktivierte Ausnahme aus FileNotFoundException Dies muss vom aufrufenden Code behandelt oder als ausgelöst deklariert werden.

Der folgende Code wird nicht kompilieren, da es beides nicht tut.

private void loadFile (String Dateiname) {FileReader in = neuer FileReader (Dateiname); }

Eine Möglichkeit, den Code zum Kompilieren zu bringen, besteht darin, die Ausnahme zu behandeln (siehe unten).

private void loadFile (String Dateiname) {try {FileReader in = neuer FileReader (Dateiname)); {} catch (FileNotFoundException ex) {// Ausnahme hier behandeln} }

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

private void loadFile (String filename) löst java.io aus. FileNotFoundException. {FileReader in = neuer FileReader (Dateiname)); { }

Deaktivierte Ausnahmen

Eine nicht aktivierte Ausnahme ist eine Ausnahme, von der eine Unterklasse stammt RuntimeException und müssen nicht direkt behandelt oder wie oben deklariert werden. Der folgende Code führt beispielsweise zu a NullPointerException, das ist eine Art von RuntimeException. Der Code wird jedoch seitdem fehlerfrei kompiliert NullPointerException ist eine ungeprüfte Ausnahme.

private void handleEvent () {String name = null; if (name.length ()> 0) {} }

Ausnahmen einpacken

Angesichts der obigen Diskussion über aktivierte und nicht aktivierte Ausnahmen scheint es einfacher zu sein, mit nicht aktivierten Ausnahmen umzugehen, da Sie sie nicht deklarieren oder selbst behandeln müssen. Aus diesem Grund kann es manchmal nützlich sein, eine aktivierte Ausnahme in eine nicht aktivierte Ausnahme zu verpacken.

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 deklariert werden, damit sie ausgelöst wird.

private void method_1 () löst SQLException aus {... neue SQLException werfen; }

Wenn diese Methode von einer anderen Methode aufgerufen wird (method_2 ()) kann diese Methode die fangen SQLException und wickeln Sie es in eine ungeprüfte Ausnahme ein, damit es die Ausnahme nicht in seiner Methodensignatur deklarieren muss.

private void method_2 () {try {method_1 (); } catch (java.sql. SQLException ex) {neue RuntimeException (ex) auslösen; } }

Exception Stack Trace

Eine Ausnahmestapelverfolgung bezieht sich auf das Array aktiver Stapelrahmen, von denen jeder einen Methodenaufruf darstellt, der von der JVM zum Zeitpunkt des Auslösens der Ausnahme erfasst wurde. Jeder Stapelrahmen enthält den Speicherort des Methodenaufrufs, einschließlich des Klassennamens, des Methodennamens und möglicherweise des Java-Quelldateinamens und der Zeilennummer in der Datei. Dies ist nützlich, um die Reihenfolge der Anrufe zurückzuverfolgen das hat den Fehler verursacht Java-Ausnahmen: Behandeln Sie sie richtig?Eine Ausnahme bei der Programmierung bedeutet eine Ausnahmebedingung bei der Programmausführung. Es wird verwendet, wenn die Bedingung anderswo besser behandelt werden kann. Betrachten Sie die folgenden Beispiele für die Behandlung von Java-Ausnahmen. Weiterlesen .

Hier ist eine typische Stapelverfolgung, die vom Ausnahmeobjekt erhalten wurde, als es abgefangen wurde.

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

Die hier gefangene Ausnahme ist IndexOutOfBoundsException. Es enthält zusätzliche Informationen zum Fehler. Die Stapelverfolgung enthält 3 Stapelrahmen, von denen jeder die gezeigten Standortinformationen enthält.

Umgang mit Ausnahmen

Eine Ausnahme kann behandelt werden, indem sie in a abgefangen wird versuchen zu fangen blockieren und alle erforderlichen Korrekturmaßnahmen ergreifen. Das Ausnahme object bietet verschiedene Methoden zum Extrahieren von Informationen über den Zustand, der es verursacht hat.

Der folgende Code protokolliert die Fehlermeldung in einer Protokolldatei.

private void loadConfig () {try {// Code aufrufen, der möglicherweise eine IOException generiert} catch (java.io. IOException ex) {// Ausnahme hier behandeln. Kann in einer Protokolldatei protokolliert werden. log.warning (ex.getMessage ()); } }

Wenn eine Ausnahme in eine andere eingeschlossen wird, können Sie die umschlossene Ausnahme abrufen:

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

Müssen Sie auf den Stack-Trace zugreifen und möglicherweise den Namen der Methode extrahieren, die ihn 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 werfen Sie sie erneut?

Versuchen {... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); Ex werfen; }

Das Ausnahme Klasse bietet eine printStackTrace () Methode, mit der der Stack-Trace auf eigene Faust gedruckt werden kann PrintStream (oder PrintWriter).

Versuchen {... } catch (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }

Sie können mehrere Arten von Ausnahmen in einer einzigen abfangen Versuchen blockieren und für jeden Ausnahmetyp eine spezifische Behandlung durchführen.

try {// löst hier einige Ausnahmen aus. } 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 a 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 endlich bereinigen

Wenn Sie mit Code arbeiten, der Ausnahmen auslösen kann, müssen Sie alle Ressourcen ordnungsgemäß bereinigen. wie geöffnete Dateien Alles, was Sie über Dateiformate und ihre Eigenschaften wissen müssenWir verwenden die Wortdatei synonym: Musik, Bild, Tabelle, Diashow und so weiter. Aber was macht eine Datei überhaupt zu einer "Datei"? Lassen Sie uns versuchen, diesen grundlegenden Teil des Rechnens zu verstehen. Weiterlesen , Datenbankverbindungen usw. Die Ressourcenbereinigung sollte in a durchgeführt werden endlich Block. Auf diese Weise rufen sowohl der normale als auch der außergewöhnliche Ausgang eines Blocks das auf Bereinigungscode Die 10 schlimmsten Programmierfehler in der GeschichteIn seiner geschichtsträchtigen Vergangenheit hat die Kodierung auch Zerstörung bewirkt. Instanzen von ein wenig schlechtem Code verursachten eine Katastrophe auf einer größeren Ebene. Das Folgende sind 10 der schlimmsten Programmierfehler in der Geschichte. Weiterlesen .

InputStream in = null; Versuchen {... in = neuer FileInputStream (Dateiname);... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); } endlich {// Code hier wird beim Verlassen des try-Blocks ausgeführt, // ob normal oder aufgrund einer Ausnahme if (in! = null) in.close (); }

Try-With-Resources-Block

Java 1.7 führte die Versuchen Sie es mit Ressourcen Konstrukt, das die Bereinigung von Ressourcen erleichtert. Es sieht aus wie das:

try (InputStream in = neuer 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 Kopf des Blocks deklarieren.

try (InputStream in = neuer FileInputStream (..); Verbindung 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 in der durch schließen() Methode.

öffentliche Klasse MyClass implementiert AutoCloseable {public void close () {// Bereinigungscode hier} }

Verwenden Sie eine Instanz dieser Klasse in a Versuchen Sie es mit Ressourcen Block.

try (MyClass obj = new MyClass (..)) {// Code, der das MyClass-Objekt verwendet. }

Einige häufig anzutreffende Ausnahmen

Schauen wir uns nun einige häufig auftretende Ausnahmen an.

  • 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 (aktiviert): Wird aufgrund eines Datenbankfehlers ausgelöst.
  • IOException (aktiviert): Dateizugriffsfehler oder Fehler im Zusammenhang mit Eingabe und Ausgabe.
  • InterruptedException (markiert): Wird ausgelöst, wenn eine Thread-Ausführung unterbrochen wird.
  • SAXException (aktiviert): Wird aufgrund von XML-Analysefehlern ausgelöst.
  • NullPointerException (nicht markiert): Verwenden von null, wenn ein Objekt erforderlich ist.

Einpacken

Ausnahmen sind die Hauptmethode für die Fehlerberichterstattung und -verwaltung in Java. Ordnungsgemäße Verwendung von Ausnahmen Verbesserung der Codequalität Schreiben oder Code schneller in Ihrem Linux-Texteditor mit benutzerdefinierten DesignsIhr Linux-Texteditor muss nicht langweilig und "funktional" aussehen. Optimieren Sie es, um Ihre Produktivität zu steigern, egal ob Sie Skripte erstellen oder codieren oder das Tool als Markup-Editor verwenden. Weiterlesen und helfen bei der Lösung von Problemen in der Produktion.

Haben Sie außergewöhnliche Kriegsgeschichten zu erzählen? Wenn ja, teilen Sie uns dies im Kommentarbereich unten mit.

Bildnachweis: Dmitry Nikolaev über Shutterstock.com