public void payForMeal(double amount) throws Exception {
    if (balance - amount < 0 && amount - balance <= creditLimit) {
        this.strStatus = "Using Credit";
        double newBalance = balance - amount;
        balance = newBalance;

        throw new ArithmeticException("\n\n-----------------------------\n" + "You must top-up your balance\n" + "Your new balance is: " + balance + "\n" + "You are: " + strStatus + "\n" + "-----------------------------\n");
    }//if

    else if (amount > creditLimit && balance < amount) {
        throw new ArithmeticException("\n\n----------------------\n" + "Cost of meal exceeds the credit limit." + "\n----------------------\n");

    }//elseif
    else {
        double newBalance = balance - amount;
        balance = newBalance;
        transCount++;
    }//else  
}//payForMeal

Gdy saldo wynosi 2, a payForMeal jest ustawione na 8, przed awarią programu drukowane są następujące informacje:

Wyświetlanie szczegółów konta:

Koszt posiłku przekracza limit kredytowy.

Customer ID:       200
Name:              Joe
Balance:           2.0
Minimum TopUp:     2.0
Account Status:    Valid
Credit Limit:      5.0
Transaction Count: 0

Jak mogę dodać próbny zaczep, aby zatrzymać awarię programowania, ale nadal drukować błędy, dzięki

-3
user12398713 19 listopad 2019, 18:58
2
Twoje zrozumienie własnego kodu znacznie by się poprawiło, gdybyś wyczyścił wcięcia.
 – 
Robert Harvey
19 listopad 2019, 19:00

2 odpowiedzi

Powinieneś owinąć metodę, która wyrzuca błąd try catch, w ten sposób

// ... some code

try {
  payForMeal(amount);
} catch (ArithmeticException e) {
  System.out.log("An error occurred trying to pay for the meal: " + e.getMessage());
}

// ... more code

Sam zdecydujesz, jak sobie poradzisz z błędem.

2
btuso 19 listopad 2019, 19:03
Jak wyjaśniono w mojej odpowiedzi, ten kod działa, ale zamienia problem programowania w problem z projektem programu.
 – 
Maarten Bodewes
19 listopad 2019, 19:09

Staraj się robić mniej w swoich metodach. Programowanie dotyczy dekompozycji i projektowania problemów.

Użyj metody checkBalanceSufficient, która zwraca wynik , zamiast robić to w kodzie. Sprawdź, jakie dane musi zwrócić. Nie umieszczaj żadnych instrukcji print, dotyczy to Twojej metody głównej lub klas związanych z interfejsem użytkownika & amp; metody.

Nie używaj ponownie ArithmeticException. Obliczenia są w porządku, jest to wynik , z którego nie jesteś zadowolony. Więc zamiast tego musisz zdefiniować własny wyjątek wyższego poziomu (programowanie wyjątku jest naprawdę łatwe, po prostu rozszerz Exception). Najlepiej jednak, jeśli Twój kod nigdy nie zgłosi wyjątku z powodu problemów z danymi wejściowymi; możesz obsłużyć błędne dane wejściowe w oddzielnych metodach na początku kodu.

Jeśli w klauzuli catch znajduje się kod wyższego poziomu (tj. Kod implementujący przypadek użycia ), to już robisz coś źle.

1
Maarten Bodewes 19 listopad 2019, 19:07