Выбрасывание собственных исключений - PullRequest
0 голосов
/ 30 мая 2020

У меня есть эта учетная запись класса

    import java.io.IllegalArgumentException;

    class Account {
        final int accountNo;
        final Customer owner;
        final double overdraft;

        double balance = 0;

        private Account(int accountNo, Customer owner, double overdraft) {
            this.accountNo = accountNo;
            this.owner = owner;
            this.overdraft = overdraft;
        }

        void print() {
            Out.println("Kontonummer: " + accountNo);
            owner.print();
            Out.format("Kontostand: %.2f%nÜberziehungsrahmen: %.2f%n", balance, overdraft);
        }

        public boolean deposit(double amount) throws IllegalArgumentException {
            if (amount <= 0) {
                throws new IllegalArgumentException("Cannot deposit negative amounts!");
                break;
            } else {
                balance += amount;
                return true;
            }

            public boolean withdraw(double amount) throws OverdraftLimitReachedException {
                if (amount <= 0 || !isCovered(amount)) {
                    throw new OverdraftLimitReachedException("Overdraft limit has been reached", accountNo);
                    break;
                } else {
                    balance -= amount;
                    return true;
                }

                boolean isCovered(double amount) {
                    return amount - overdraft <= balance;
                }

                boolean transfer(Account target, double amount) {
                    boolean success = withdraw(amount);
                    if (!success) return false;

                    target.deposit(amount);
                    return true;
                }
            }
        }
    }

Теперь у меня также есть это исключение, которое я написал

    public class NoSuchAccountException extends AccountException {

        public NoSuchAccountException(int accountNo) {
            super(message, accountNo);
        }
    }

Теперь мне нужно выбросить это исключение в учетной записи класса при поиске номер учетной записи не существует.Теперь у меня вопрос, в каком методе (или функции, я думаю, что это то же самое, пожалуйста, поправьте меня, если я ошибаюсь) я выбрасываю это исключение.И после какой проверки.Как мне проверить, есть ли учетная запись number существует, и если его нет, я выброшу это исключение. Спасибо!

РЕДАКТИРОВАТЬ: Класс банковского дела, чтобы завершить программу

class Banking {
  static final int CAPACITY = 100;

  final Account[] accounts = new Account[CAPACITY];
  int nOfAccounts = 0;

  int createAccount(String firstName, String lastName, String phone, double overdraft) {
    if (nOfAccounts == CAPACITY) return -1;

    // use nOfAccounts as accountNo and index to array
    Customer owner = new Customer(firstName, lastName, phone);
    Account account = new Account(nOfAccounts, owner, overdraft);
    accounts[nOfAccounts] = account;
    nOfAccounts++;

    return account.accountNo;
  }

  boolean deposit(int accountNo, double amount) {
    if (accountNo < 0 || accountNo >= nOfAccounts) return false;

    Account account = accounts[accountNo];
    return account.deposit(amount);
  }

  boolean withdraw(int accountNo, double amount) {
    if (accountNo < 0 || accountNo >= nOfAccounts) return false;

    Account account = accounts[accountNo];
    return account.withdraw(amount);
  }

  boolean transfer(int fromNo, int toNo, double amount) {
    if (fromNo < 0 || toNo < 0 ||
        fromNo >= nOfAccounts || toNo >= nOfAccounts) return false;

    Account from = accounts[fromNo];
    Account to = accounts[toNo];
    return from.transfer(to, amount);
  }

  double getBalance(int accountNo) {
    if (accountNo < 0 || accountNo >= nOfAccounts) return 0;

    Account account = accounts[accountNo];
    return account.balance;
  }

  double getBalance() {
    double sum = 0;

    for (int i = 0; i < nOfAccounts; i++) {
      sum += accounts[i].balance;
    }
    return sum;
  }

  void print() {
    Out.println("---------- Bankauszug ----------");

    for (int i = 0; i < nOfAccounts; i++) {
      accounts[i].print();
      Out.println("--------------------------------");
    }
    Out.format("Bilanzsumme: %.2f%n", getBalance());
    Out.println("--------------------------------");
  }

  // --------------------- Optionaler Teil ---------------------

  public static void main(String[] args) {
    Banking banking = new Banking();
    char op;

    do {
      printMenu();
      op = readOperation();

      switch (op) {
        case 'a': {
          printTitle("Konto anlegen");
          String firstName = getString("Vorname");
          String lastName = getString("Nachname");
          String phone = getString("Telefonnummer");
          double overdraft = getDouble("Überziehungsrahmen");

          int accountNo = banking.createAccount(
            firstName, lastName, phone, overdraft);
          printMessage("Anlegen von Konto " + accountNo, accountNo != -1);
          break;
        }
        case 'e': {
          printTitle("Einzahlen");
          int accountNo = getInt("Kontonummer");
          double amount = getDouble("Einzahlungsbetrag");

          boolean success = banking.deposit(accountNo, amount);
          printMessage("Einzahlen", success);
          break;
        }
        case 'b': {
          printTitle("Abheben");
          int accountNo = getInt("Kontonummer");
          double amount = getDouble("Abhebungsbetrag");

          boolean success = banking.withdraw(accountNo, amount);
          printMessage("Abheben", success);
          break;
        }
        case 't': {
          printTitle("Überweisen");
          int fromNo = getInt("Von Kontonummer");
          int toNo = getInt("Auf Kontonummer");
          double amount = getDouble("Betrag");

          boolean success = banking.transfer(fromNo, toNo, amount);
          printMessage("Überweisen", success);
          break;
        }
        case 'd':
          banking.print();
          break;
        case 'q':
          Out.println("Beenden");
          break;
        default:
          Out.println("Ungültige Operation");
          break;
      }
    } while(op != 'q');
  }

  static void printMenu() {
    Out.println();
    Out.println("*********** Bankverwaltung ********");
    Out.println("Konto anlegen ................... a");
    Out.println("Einzahlen ....................... e");
    Out.println("Beheben ......................... b");
    Out.println("Überweisen ...................... t");
    Out.println("Übersicht drucken ............... d");
    Out.println("Beenden ......................... q");
    Out.print("Welche Menuoption? [a|e|b|t|d|q]: ");
  }

  static char readOperation() {
    char ch = Character.toLowerCase(In.readChar());
    In.readLine();
    return ch;
  }

  static void printTitle(String text) {
    Out.println("*** " + text + " ***");
  }

  static String getString(String text) {
    Out.print(text + ": ");
    return In.readLine();
  }

  static double getDouble(String text) {
    Out.print(text + ": ");
    return In.readDouble();
  }

  static int getInt(String text) {
    Out.print(text + ": ");
    return In.readInt();
  }

  static void printMessage(String operation, boolean success) {
    String message = success ?
      operation + " erfolgreich durchgeführt" :
      "Ungültige Operation";
    Out.println(message);
  }
}

Ответы [ 4 ]

1 голос
/ 30 мая 2020

Это зависит от интерфейса, который вы создаете. В настоящее время в вашем коде есть интерфейс, в котором вы возвращаете false, если учетная запись не найдена или что-то другое не удается. У такой обработки ошибок есть свои преимущества и недостатки. Один из способов, который потенциально является fr agile, состоит в том, что вызывающий метод (-ы) может забыть проверить код возврата, что может быть потенциально очень плохим для этого случая (вызывающий сначала пытается снять деньги, что не удается, и затем помещает деньги на другой счет, создавая деньги из ниоткуда).

Есть аргументы за и против. Альтернативный способ обработки ошибок - генерировать исключения вместо возврата логического значения для обработки ошибок, что имело бы свои преимущества и недостатки. В Java, если вы убедитесь, что это проверенное исключение, вызывающий будет вынужден перехватить или выбросить исключение как часть системы типов. В любом случае, я не знаю, как я отношусь к смешиванию двух способов обработки ошибок, поскольку это может быть очень чревато ошибками и сбивать с толку.

Если вы go вместе с исключительным способом обработки ошибок , одним из распространенных рефакторингов может быть частный метод под названием checkOrThrowAccountMustExist, который принимает идентификатор учетной записи в качестве входных данных и выдает его, если он не существует.

Существует также проблема размещения проверок в Banking класс и / или Account класс. По моему собственному мнению, имеет смысл включить хотя бы некоторые проверки в оба, и что было бы неплохо включить проверки в те классы, которые доступны извне или в другие части вашей программы (и задокументировать, если класс не предназначен для использования вне небольшой части вашей программы). Но это может или не может выходить за рамки вашего задания.

0 голосов
/ 30 мая 2020

Создайте метод в классе учетной записи, который принимает номер учетной записи и возвращает true, если учетная запись присутствует, в противном случае - false. Вы можете вызвать этот метод из методов депозита или снятия и продолжить, только когда он вернет истину, в противном случае выбросите исключение NoSuchAccountException.

0 голосов
/ 30 мая 2020

Извлечь общее место для получения счёта

private Acount getAccount(accountNo) {
  if (accountNo >= accounts.length || accounts[accountNo] == null) {
   throw new NoSuchAccountException();
  }
  return account;
}


  boolean deposit(int accountNo, double amount) {
    Account account = getAccount(accountNo);
    return account.deposit(amount);
  }

0 голосов
/ 30 мая 2020

Я полагаю, у вас есть классный банк или что-то подобное, и клиент приходит, чтобы что-то сделать со своими деньгами. Итак, он дает вам номер счета, задачу и, возможно, сумму денег. Этому классу потребуется массив или список учетных записей. Методы этого класса будут подходящим местом для вашего исключения. У вас есть методы, в основном те же, что и в вашем аккаунте. Сначала они проверяют, существует ли учетная запись в массиве / списке, а затем вызывают метод для выбранной учетной записи или генерируют исключение, если оно не существует.

метод против функции: Насколько я понимаю, методы и функции являются то же самое, за исключением одного небольшого различия: функция - это функция в глобальном пространстве, тогда как метод - это функция, привязанная к классу или объекту. Таким образом, Java не имеет реальных функций. Но в моем понимании каждый метод stati c - это функция, но привязанная к пространству имен класса. Но это скорее практическая, чем теоретическая точка зрения.

...