Erstellen Sie eine benutzerdefinierte Ausnahme in Java
1. Einführung
In diesem Tutorial behandeln wirhow to create a custom exception in Java.
Wir zeigen, wie benutzerdefinierte Ausnahmen implementiert und sowohl für aktivierte als auch für nicht aktivierte Ausnahmen verwendet werden.
2. Die Notwendigkeit für benutzerdefinierte 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 von benutzerdefinierten Ausnahmen sind:
-
Geschäftslogik-Ausnahmen - Ausnahmen, die für die Geschäftslogik und den Workflow spezifisch sind. Diese helfen den Anwendern oder Entwicklern, das genaue Problem zu verstehen
-
Erfassung und gezielte Behandlung einer Teilmenge bestehender Java-Ausnahmen
Java-Ausnahmen können aktiviert und deaktiviert werden. In den nächsten Abschnitten werden wir beide Fälle behandeln.
3. Benutzerdefinierte überprü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 von Java geprüften Ausnahmen. Während der CodeFileNotFoundException, 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 Klassejava.lang.Exceptionerweitern.
Sehen wir uns ein Beispiel dafür an, indem wir eine benutzerdefinierte geprüfte Ausnahme mit dem NamenIncorrectFileNameException: erstellen
public class IncorrectFileNameException extends Exception {
public IncorrectFileNameException(String errorMessage) {
super(errorMessage);
}
}
Beachten Sie, dass wir auch einen Konstruktor bereitstellen müssen, derString 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 sehen wir uns an, 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 sind folglichlosing the root cause of the exception.
Um dies zu beheben, können wir dem Konstruktor auch einenjava.lang.Throwable-Parameter 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 wirdIncorrectFileNameException 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);
}
// ...
}
So können wir benutzerdefinierte Ausnahmenwithout losing the root cause from which they occurred verwenden.
4. Benutzerdefinierte ungeprüfte 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.
To create a custom unchecked exception we need to extend the java.lang.RuntimeException class:
public class IncorrectFileExtensionException
extends RuntimeException {
public IncorrectFileExtensionException(String errorMessage, Throwable err) {
super(errorMessage, err);
}
}
Daher können wir diese benutzerdefinierte, nicht aktivierte 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. Fazit
Benutzerdefinierte Ausnahmen sind sehr nützlich, wenn wir bestimmte Ausnahmen im Zusammenhang mit der Geschäftslogik behandeln müssen. Bei richtiger 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 lautetover on Github.