Erstellen Sie eine benutzerdefinierte Ausnahme in Java

1. Einleitung

In diesem Tutorial erfahren Sie, wie Sie eine benutzerdefinierte Ausnahme in Java erstellen .

Wir zeigen, wie benutzerdefinierte Ausnahmen implementiert und sowohl für aktivierte als auch für nicht aktivierte Ausnahmen verwendet werden.

2. Notwendigkeit benutzerdefinierter Ausnahmen

Java-Ausnahmen decken fast alle allgemeinen Ausnahmen ab, die bei der Programmierung auftreten müssen.

Manchmal müssen wir diese Standardausnahmen jedoch durch unsere eigenen ergänzen.

Die Hauptgründe für die Einführung benutzerdefinierter Ausnahmen sind:

  • Ausnahmen für Geschäftslogik - Ausnahmen, die für die Geschäftslogik und den Workflow spezifisch sind. Diese helfen den Anwendungsbenutzern oder Entwicklern zu verstehen, wo genau das Problem liegt
  • Abfangen und spezifische Behandlung einer Teilmenge vorhandener Java-Ausnahmen

Java-Ausnahmen können aktiviert und deaktiviert werden. In den nächsten Abschnitten werden wir beide Fälle behandeln.

3. Benutzerdefinierte geprüfte Ausnahme

Überprüfte Ausnahmen sind Ausnahmen, die explizit behandelt werden müssen.

Betrachten wir einen Code, der die erste Zeile der Datei zurückgibt:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch(FileNotFoundException e) { // Logging, etc } 

Der obige Code ist eine klassische Methode zur Behandlung von Java-geprüften Ausnahmen. Während der Code FileNotFoundException auslöst, ist nicht klar, was die genaue Ursache ist - ob die Datei nicht existiert oder der Dateiname ungültig ist.

Um eine benutzerdefinierte Ausnahme zu erstellen, müssen wir die Klasse java.lang.Exception erweitern .

Sehen wir uns ein Beispiel dafür an, indem wir eine benutzerdefinierte geprüfte Ausnahme namens IncorrectFileNameException erstellen :

public class IncorrectFileNameException extends Exception { public IncorrectFileNameException(String errorMessage) { super(errorMessage); } } 

Beachten Sie, dass wir auch einen Konstruktor bereitstellen müssen, der einen String als Fehlermeldung verwendet und den Konstruktor der übergeordneten Klasse aufruft.

Dies ist alles, was wir tun müssen, um eine benutzerdefinierte Ausnahme zu definieren.

Als nächstes wollen wir sehen, wie wir die benutzerdefinierte Ausnahme in unserem Beispiel verwenden können:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch (FileNotFoundException e) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException("Incorrect filename : " + fileName ); } //... } 

Wir haben eine benutzerdefinierte Ausnahme erstellt und verwendet, damit der Benutzer jetzt die genaue Ausnahme erkennt. Ist das genug? Wir verlieren folglich die Grundursache der Ausnahme .

Um dies zu beheben, können wir dem Konstruktor auch einen Parameter java.lang.Throwable hinzufügen . Auf diese Weise können wir die Root-Ausnahme an den Methodenaufruf übergeben:

public IncorrectFileNameException(String errorMessage, Throwable err) { super(errorMessage, err); } 

Jetzt wird die IncorrectFileNameException zusammen mit der Grundursache der Ausnahme wie folgt verwendet:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } // ... } 

Auf diese Weise können wir benutzerdefinierte Ausnahmen verwenden, ohne die Grundursache zu verlieren, von der sie aufgetreten sind .

4. Benutzerdefinierte nicht aktivierte Ausnahme

Nehmen wir im selben Beispiel an, dass wir eine benutzerdefinierte Ausnahme benötigen, wenn der Dateiname keine Erweiterung enthält.

In diesem Fall benötigen wir eine benutzerdefinierte deaktivierte Ausnahme ähnlich der vorherigen, da dieser Fehler nur zur Laufzeit erkannt wird.

Um eine benutzerdefinierte ungeprüfte Ausnahme zu erstellen, müssen Sie die Klasse java.lang.RuntimeException erweitern :

public class IncorrectFileExtensionException extends RuntimeException { public IncorrectFileExtensionException(String errorMessage, Throwable err) { super(errorMessage, err); } } 

Daher können wir diese benutzerdefinierte ungeprüfte Ausnahme in unserem Beispiel verwenden:

try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } else { throw new IllegalArgumentException("Non readable file"); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } //... } catch(IllegalArgumentException err) { if(!containsExtension(fileName)) { throw new IncorrectFileExtensionException( "Filename does not contain extension : " + fileName, err); } //... } 

5. Schlussfolgerung

Benutzerdefinierte Ausnahmen sind sehr nützlich, wenn wir bestimmte Ausnahmen im Zusammenhang mit der Geschäftslogik behandeln müssen. Bei ordnungsgemäßer Verwendung können sie als nützliches Werkzeug für eine bessere Ausnahmebehandlung und Protokollierung dienen.

Der Code für die in diesem Artikel verwendeten Beispiele ist auf Github verfügbar.