Effektives Java Verwenden Sie geprüfte Ausnahmen für wiederherstellbare Zustände und Laufzeitausnahmen für Programmierfehler

Effektive Java-eigene Interpretation. Ich habe versucht, Punkt 70 der 3. Ausgabe zu interpretieren, indem ich meinen eigenen Code geschrieben habe.

Grob

"Wiederherstellbar" bedeutet, dass der aktuelle Thread nicht gestoppt werden kann, selbst wenn eine Ausnahme auftritt, und der Status an ein anderes Steuerelement zurückgegeben werden kann. Da der Methodenimplementierer weiß, dass eine Ausnahme auftreten kann, gibt er eine überprüfte Ausnahme aus und zwingt den Aufrufer der Methode, diese zu behandeln. Ein "Programmierfehler" ist einer, bei dem die Methode so verwendet wird, dass der Implementierer dies verbietet und der aktuelle Thread gestoppt werden muss. Drucken Sie eine Laufzeitausnahme (die im Allgemeinen nicht abgefangen werden sollte).

Beispiele, die geprüfte Ausnahmen erfordern

Betrachten Sie die folgende Service-Layer-Methode.

** Diese Kaufmethode **


     /**
     *Kaufen Sie ein Buch mit der angegebenen ID
     *Fügen Sie gekaufte Bücher zur Tabelle der gekauften Bücher hinzu, um das Guthaben zu verringern
     *Geben Sie eine Ausnahme aus, wenn der Kontostand nicht ausreicht
     *
     * @param bookId Zu erwerbende Buch-ID
     * @param userId Benutzer-ID
     * @löst eine InsufficientFundsException aus
     */
    public void buyBook(String bookId, int userId) throws InsufficientFundsException {

        //Holen Sie sich den Preis des Buches zu kaufen
        Book selectedBook = bookDao.selectByBookId(bookId);
        int bookPrice = selectedBook.getPrice();

        //Holen Sie sich das Gleichgewicht
        BankAccount myBankAccount = bankAccountDao.selectByUserId(userId);
        int myBalance = myBankAccount.getBalance();

        //Geben Sie eine Ausnahme aus, wenn der Kontostand nicht ausreicht
        if (bookPrice > myBalance) {
            int shortage = bookPrice - myBalance;
            throw new InsufficientFundsException("Das Gleichgewicht ist unzureichend.", shortage);
        }

        //Fügen Sie gekaufte Bücher zur Tabelle der gekauften Bücher hinzu
        BoughtBook myBoughtBook = new BoughtBook();
        myBoughtBook.setUserId(userId);
        myBoughtBook.setBookId(bookId);
        boughtBookDao.insert(myBoughtBook);

        //Guthaben reduzieren und aktualisieren
        int afterMyBalance = myBalance - bookPrice;
        myBankAccount.setBalance(afterMyBalance);
        bankAccountDao.update(myBankAccount);
    }

** Unzureichende Ausnahmeklasse für Guthaben **


/**
 *Unzureichende Balance-Ausnahme
 */
public class InsufficientFundsException extends Exception {

    private int shortage;

    /**
     *Ausnahmemeldung und Fehlbetrag
     *
     * @param message Ausnahmemeldung
     * @Param Mangel Mangel Betrag
     */
    public InsufficientFundsException(String message, int shortage) {
        super(message);
        this.shortage = shortage;
    }

    public int getShortage() {
        return this.shortage;
    }
}

Grund für die Ausgabe einer aktivierten Ausnahme

Ob Sie ein Buch kaufen können oder nicht, hängt von Ihrem aktuellen Kontostand ab. Kurz gesagt, es besteht die Möglichkeit, dass eine Ausnahmesituation auftritt, in der ein Buch nicht gekauft werden kann. Daher wird eine Prüfausnahme ausgegeben, um den Anrufer zu zwingen, zu einem anderen Prozess zu wechseln, oder eine Fehlermeldung auszugeben, um die Behandlung zu erzwingen. Wenn eine nicht aktivierte Ausnahme ausgegeben wird, erkennt der Aufrufer möglicherweise nicht, dass die Behandlung implementiert werden muss, und der aktuelle Thread wird möglicherweise gestoppt, ohne in den Wiederherstellungsprozess einzutreten.

Nehmen Sie zusätzliche Informationen in die Handhabung auf

Auf der Handhabungsseite kann es nützlich sein, zusätzliche Informationen in die ausgegebenen Ausnahmen aufzunehmen. Im obigen Code kann beispielsweise durch Einbeziehen der unzureichenden Kontostandinformationen in die Ausnahme angegeben werden, um wie viel der Kontostand nicht ausreicht, wenn die Bearbeitungsseite eine Fehlermeldung an den Benutzer senden möchte.

Beispiele, die eine Laufzeitausnahme erfordern

Betrachten Sie die folgende Service-Layer-Methode.

--Senden Sie den angegebenen Betrag an die angegebene Person

** Geldtransfermethode **

    /**
     *Senden Sie den angegebenen Betrag an die angegebene Person
     *Geben Sie eine positive Zahl für den Überweisungsbetrag an
     *
     * @param transferPrice Überweisungsbetrag
     * @param targetUserId ID des Empfängers
     */
    public void transferMoney(int transferPrice, int targetUserId) {

        if (transferPrice <= 0) {
            throw new IllegalArgumentException("Der Überweisungsbetrag muss als positive Zahl angegeben werden.");
        }

        BankAccount targetBankAccount = bankAccountDao.selectByUserId(targetUserId);
        int nowBalance = targetBankAccount.getBalance();
        int afterBalance = nowBalance + transferPrice;
        targetBankAccount.setBalance(afterBalance);
        bankAccountDao.update(targetBankAccount);
    }

Gründe für das Drucken einer Laufzeitausnahme

Diese Methode verbietet die Angabe nicht positiver Zahlen. Dies liegt daran, dass bei Angabe einer negativen Zahl das Guthaben der anderen Partei reduziert wird. Da die Implementierung des Methodenaufrufers 100% der nicht positiven Zahlen verhindern kann, wird eine nicht positive Zahl als Programmfehler beurteilt, eine Laufzeitausnahme ausgegeben und der aktuelle Thread gestoppt. Dies liegt daran, dass bei Fortsetzung der Verarbeitung eine unbeabsichtigte Verarbeitung auftreten kann, was gefährlich ist.

(Ergänzung) Nicht alle Laufzeitausnahmen sollten abgefangen werden

Es sollten nicht alle Laufzeitausnahmen abgefangen werden. Spring-Datenzugriffsausnahmen werden als Laufzeitausnahmen implementiert und können eine weitere aktivierte Ausnahme abfangen und erneut auslösen.

Recommended Posts

Effektives Java Verwenden Sie geprüfte Ausnahmen für wiederherstellbare Zustände und Laufzeitausnahmen für Programmierfehler
Punkt 70: Verwenden Sie geprüfte Ausnahmen für wiederherstellbare Bedingungen und Laufzeitausnahmen für Programmierfehler
Java-Programmierung (Variablen und Daten)
Java während und für Anweisungen