Unterschied zwischen Throw und Throw in Java

Unterschied zwischen Throw und Throws in Java

1. Einführung

In diesem Tutorial sehen wir uns diethrow undthrows in Java an. Wir werden erklären, wann wir jeden von ihnen verwenden sollten.

Als nächstes zeigen wir einige Beispiele für ihre grundlegende Verwendung.

2. Throw undThrows

Beginnen wir mit einer kurzen Einführung. Diese Schlüsselwörter beziehen sich auf die Ausnahmebehandlung. Exceptions are raised when the normal of flow of our application is disrupted.

Es kann viele Gründe geben. Ein Benutzer könnte die falschen Eingabedaten senden. Wir können die Verbindung verlieren oder es kann eine andere unerwartete Situation eintreten. Eine gute Ausnahmebehandlung ist ein Schlüssel, um unsere Anwendung nach dem Auftreten dieser unangenehmen Momente am Laufen zu halten.

We use throw keyword to explicitly throw an exception aus dem Code. Es kann sich um eine beliebige Methode oder einen statischen Block handeln. Diese Ausnahme muss eine Unterklasse vonThrowable. sein. Sie kann auch selbst eineThrowable sein. Wir können nicht mehrere Ausnahmen mit einem einzigenthrow auslösen.

Das SchlüsselwortThrowskann in die Methodendeklaration eingefügt werden. It denotes which exceptions can be thrown from this method. Wir müssen diese Ausnahmen mit try-catch behandeln.

Diese beiden Schlüsselwörter sind nicht austauschbar!

3. Throw in Java

Schauen wir uns ein einfaches Beispiel an, bei dem eine Ausnahme von der Methode ausgelöst wird.

Stellen Sie sich zunächst vor, wir schreiben einen einfachen Taschenrechner. Eine der Grundrechenarten ist die Division. Aus diesem Grund wurden wir gebeten, diese Funktion zu implementieren:

public double divide(double a, double b) {
    return a / b;
}

Da wir nicht durch Null teilen können, müssen wir einige Änderungen an unserem vorhandenen Code hinzufügen. Es scheint ein guter Moment zu sein, um eine Ausnahme auszulösen.

Lass uns das machen:

public double divide(double a, double b) {
    if (b == 0) {
        throw new ArithmeticException("Divider cannot be equal to zero!");
    }
    return a / b;
}

Wie Sie sehen können, haben wirArithmeticException verwendet, die perfekt zu unseren Anforderungen passen. Wir können einen einzelnenString Konstruktorparameter übergeben, der eine Ausnahmemeldung ist.

3.1. Gute Praktiken

We should always prefer the most specific exception. Wir müssen eine Klasse finden, die am besten zu unserer außergewöhnlichen Veranstaltung passt. Zum Beispiel werfen SieNumberFormatException anstelle vonIllegalArgumentException. Wir sollten vermeiden, unspezifischeException zu werfen.

Zum Beispiel gibt es eineInteger-Klasse imjava.lang-Paket. Werfen wir einen Blick auf die Deklaration der Factory-Methode:

public static Integer valueOf(String s) throws NumberFormatException

Es handelt sich um eine statische Factory-Methode, die dieInteger-Instanz ausString.  erstellt. Bei falscher Eingabe vonString gibt die MethodeNumberFormatException. aus

A good idea is to define our own, more descriptive exception. In unsererCalculator -Skala könnte dies beispielsweiseDivideByZeroException.  sein

Werfen wir einen Blick auf die Beispielimplementierung:

public class DivideByZeroException extends RuntimeException {

    public DivideByZeroException(String message) {
        super(message);
    }
}

3.2. Eine vorhandene Ausnahme umbrechen

Manchmal möchten wir eine vorhandene Ausnahme in die von uns definierte Ausnahme einschließen.

Beginnen wir mit der Definition unserer eigenen Ausnahme:

public class DataAcessException extends RuntimeException {

    public DataAcessException(String message, Throwable cause) {
        super(message, cause);
    }
}

Der Konstruktor akzeptiert zwei Parameter: eine Ausnahmemeldung und eine Ursache, die eine beliebige Unterklasse vonThrowable.  sein kann

Schreiben wir eine gefälschte Implementierung für diefindAll() -Funktion:

public List findAll() throws SQLException {
    throw new SQLException();
}

Rufen wir nun inSimpleService eine Repository-Funktion auf, die zuSQLException: führen kann

public void wrappingException() {
    try {
        personRepository.findAll();
    } catch (SQLException e) {
        throw new DataAccessException("SQL Exception", e);
    }
}

Wir werfenSQLException erneut in unsere eigene Ausnahme namensDataAccessException. . Alles wird durch den folgenden Test überprüft:

@Test
void whenSQLExceptionIsThrown_thenShouldBeRethrownWithWrappedException() {
    assertThrows(DataAccessException.class,
      () -> simpleService.wrappingException());
}

Dafür gibt es zwei Gründe. Zunächst verwenden wir die Ausnahmebedingungsumhüllung, da der Rest des Codes nicht über alle möglichen Ausnahmen im System Bescheid wissen muss.

Auch übergeordnete Komponenten müssen weder über untergeordnete Komponenten noch über die von ihnen ausgelösten Ausnahmen Bescheid wissen.

3.3. Multi-Catch mit Java

Manchmal können die von uns verwendeten Methoden viele verschiedene Ausnahmen auslösen.

Werfen wir einen Blick auf einen umfangreicheren Try-Catch-Block:

try {
    tryCatch.execute();
} catch (ConnectionException | SocketException ex) {
    System.out.println("IOException");
} catch (Exception ex) {
    System.out.println("General exception");
}

Die Methodeexecute kann drei Ausnahmen auslösen:SocketException, ConnectionException, Exception. Der erste Catch-Block fängtConnectionException oderSocketException. Der zweite Fangblock würdeException oder jede andere Unterklasse vonException. abfangen. Denken Sie daran, dasswe should always catch a more detailed exception first.

Wir können die Reihenfolge unserer Fangblöcke tauschen. Dann würden wir niemalsSocketException undConnectionException fangen, da alles mitException zum Fang geht.

4. Throws in Java

Wir fügenthrows to zur Methodendeklaration hinzu.

Werfen wir einen Blick auf eine unserer vorherigen Methodendeklarationen:

public static void execute() throws SocketException, ConnectionException, Exception

The method may throw multiple exceptions. Sie werden am Ende einer Methodendeklaration durch Kommas getrennt. Wir können sowohl geprüfte als auch ungeprüfte Ausnahmen inthrows. etzen. Wir haben den Unterschied zwischen ihnen unten beschrieben.

4.1. Aktivierte und deaktivierte Ausnahmen

A checked exception means that it’s checked at the compile time. Beachten Sie, dass wir diese Ausnahme behandeln müssen. Andernfalls muss eine Methode eine Ausnahme mithilfe des Schlüsselwortsthrowsangeben.

Die am häufigsten überprüften Ausnahmen sindIOException, FileNotFoundException, ParseException. FileNotFoundException may, die ausgelöst werden, wennFileInputStream ausFile.  erstellt werden

Es gibt ein kurzes Beispiel:

File file = new File("not_existing_file.txt");
try {
    FileInputStream stream = new FileInputStream(file);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

Wir können die Verwendung des try-catch-Blocks vermeiden, indem wirthrows to zur Methodendeklaration hinzufügen:

private static void uncheckedException() throws FileNotFoundException {
    File file = new File("not_existing_file.txt");
    FileInputStream stream = new FileInputStream(file);
}

Leider muss eine übergeordnete Funktion diese Ausnahme noch behandeln. Andernfalls müssen wir diese Ausnahme in die Methodendeklaration mitthrows keyword. einfügen

Im Gegenteil,unchecked exceptions aren’t checked at the compile time. 

Die häufigsten ungeprüften Ausnahmen sind:ArrayIndexOutOfBoundsException, IllegalArgumentException, NullPointerException. 

Unchecked exceptions are thrown during runtime. Der folgende Code löst einNullPointerException. aus. Wahrscheinlich ist dies eine der häufigsten Ausnahmen in Java.

Das Aufrufen einer Methode für eine Nullreferenz führt zu der folgenden Ausnahme:

public void runtimeNullPointerException() {
    String a = null;
    a.length();
}

Überprüfen wir dieses Verhalten im Test:

@Test
void whenCalled_thenNullPointerExceptionIsThrown() {
    assertThrows(NullPointerException.class,
      () -> simpleService.runtimeNullPointerException());
}

Bitte denken Sie daran, dass dieser Code und Test nicht viel Sinn macht. Es dient nur zu Lernzwecken, um Laufzeitausnahmen zu erklären.

In Java ist jede Unterklasse vonError undRuntimeException eine ungeprüfte Ausnahme. Eine aktivierte Ausnahme ist alles andere unter derThrowable -Klasse.

5. Fazit

In diesem Artikel haben wir den Unterschied zwischen zwei Java-Schlüsselwörtern erörtert:throw undthrows. Wir haben die grundlegende Verwendung durchgearbeitet und ein wenig über bewährte Methoden gesprochenDann haben wir gesprochen aktivierte und deaktivierte Ausnahmen.

Wie immer kann der Quellcodeon our GitHub gefunden werden.

Wenn Sie sich eingehender mit der Ausnahmebehandlung in Java befassen möchten, lesen Sie bitte unseren Artikelabout Java exceptions.