繁体   English   中英

如何在Java中引发异常?

[英]How do I throw an exception in java?

嗯..这是给我的指示:

支持与其他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);
    }
}
throw new Exception("Currencies are incompatible");

但是,我会考虑创建一个特定于应用程序或Money异常,根据您的需要将ExceptionRuntimeException子类RuntimeException

如果事情必须MoneyException话,可能是MoneyConversionException扩展了MoneyException

我认为这是使用未经检查的异常的好地方; 尝试添加不兼容的货币是由于编程错误。 所以我建议:

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

由于IllegalArgumentException派生自RuntimeException ,因此您无需声明add()方法可以抛出它。

不要创建一个自定义子类RuntimeException 当应用程序试图从特定错误中恢复时,自定义异常类型非常有用,而不仅仅是使用相同的日志记录或警报机制来处理每个异常。 程序不应尝试从诸如此类的特定编程错误中恢复。

正如其他人提到的那样,您有很多资源可供使用(例如this )。 无论如何,除此之外,我会警惕抛出自定义异常。 而是抛出一个现有的(例如IllegalArgumentException )以最小化复杂性。

应该抛出任何Exception需要throw子句:

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

在该方法中,您需要过滤掉要引发异常的情况(例如,如果有if子句),然后执行以下操作:

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

在此示例中,MoneyException是扩展Exception的类:

class MoneyException extends Exception {..}

引发异常与报告错误有关,必须将其声明为方法声明的一部分。 例如:

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);
               }
       }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM