Как я могу бросить исключение в Java? - PullRequest
1 голос
/ 08 декабря 2011

Хм .. Вот инструкция, данная мне:

Поддерживает сложение и вычитание с другим объектом Money
Выдает исключение, если валюты несовместимы.

Хм .. У меня уже есть класс денег с add () в нем. Как именно я выбрасываю исключение в этом случае? Я имею в виду, я знаю, как сделать попытку {} поймать, но где я должен это сделать? Я делаю это в одном классе денег? или следует генерировать исключения где-нибудь, как в main (), где происходит все остальное?

public class Money {

    Currency currency;
    int dollar;
    int cents;

    //constructor
    public Money(Currency currency, int dollar, int cents) {
        super();
        this.currency = currency;
        this.dollar = dollar;
        this.cents = cents;
    }
    .
    .
    .
    .
    public Money add(Money moneyToBeAdded){
        Money result = new Money(moneyToBeAdded.getCurrency(),0,0);
        Money totalInCents;

        if(compareCurrency(moneyToBeAdded)){
            totalInCents = new Money(moneyToBeAdded.getCurrency(),0,(moneyToBeAdded.toCents() + cents));
            result = totalInCents.toDollars();
        }//to do convert currency

        return result;
    }

    public Money subtract()

    public boolean compareCurrency(Money money){
        return money.currency.equals(currency);
    }
}

Ответы [ 6 ]

4 голосов
/ 08 декабря 2011
throw new Exception("Currencies are incompatible");

Тем не менее, я бы подумал о создании исключения для конкретного приложения или Money, вместо этого выделив подклассы либо Exception, либо RuntimeException в зависимости от ваших потребностей.

Возможно, MoneyConversionExceptionрасширение MoneyException если вещи должны быть гранулированными.

2 голосов
/ 08 декабря 2011

Я думаю, что это хорошее место для использования непроверенного исключения;любая попытка добавить несовместимые деньги связана с ошибкой программирования.Поэтому я бы предложил:

if (!compareCurrency(moneyToBeAdded))
  throw new IllegalArgumentException("Mismatched currencies.");

Поскольку IllegalArgumentException происходит от RuntimeException, вам не нужно объявлять, что метод add() может его выбросить.

Do not создать пользовательский подкласс RuntimeException.Пользовательские типы исключений полезны, когда приложение пытается восстановиться после определенной ошибки, а не просто используют один и тот же механизм ведения журнала или оповещения для обработки каждого исключения.Программы не должны пытаться восстанавливаться после определенных ошибок программирования, подобных этой.

1 голос
/ 08 декабря 2011

Как уже упоминалось, в вашем распоряжении множество ресурсов (например, this ). В любом случае, если бы не это, я бы с осторожностью выбрасывал пользовательское исключение. Вместо этого бросьте существующий (например, IllegalArgumentException), чтобы минимизировать сложность.

0 голосов
/ 08 декабря 2011

Создание исключения - это сообщение об ошибке, и оно должно быть объявлено как часть объявления метода.Например:

class SomeMoneyProblem extends Exception {
      public SomeMoneyProblem() {
            super();
      }

      public SomeMoneyProblem(String msg) {
            super(msg);
      }
}

    public class Money {

       ...

       public Money() { 

       }

       public Money someMoneyMethod(Money moreMoney) throws SomeMoneyProblem {
               ....
               if ( someProblemCondition )
                      throw new SomeMoneyProblem();

               if ( someOtherProblem ) 
                      throw new SomeMoneyProblem("Other Problem");

       }

       public static void main() {

               Money m = new Money();
               try {
                    m.someMoneyMethod();
               } catch (SomeMoneyProblem p) {
                    System.err.println(p);
               }
       }
    }
0 голосов
/ 08 декабря 2011

См. Урок с веб-сайта Oracle

http://docs.oracle.com/javase/tutorial/essential/exceptions/

0 голосов
/ 08 декабря 2011

Метод, который должен вызывать любое Exception, нуждается в предложении throw:

public Money add(Money moneyToBeAdded) throws MoneyException{..}

В этом методе вам необходимо отфильтровать случаи, когда вы хотите, чтобы исключение было выдано (с помощью if-clauses, например), а затем перейти:

throw new MoneyException("don't like that currency");

В этом примере MoneyException - это класс, который расширяет Exception:

class MoneyException extends Exception {..}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...