2011-12-08 137 views
1

嗯..这是给我的指令:如何在java中抛出异常?

支持另外&减法与其他货币对象
抛出异常,如果货币是不相容的。

嗯..我已经有了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); 
    } 
} 
+2

有很多可用的资源可以通过[简单的谷歌搜索]找到(https://www.google.com/search?q=how+to+throw+an+exception+in+java ),没有人帮助你? –

+0

我想我只是不确定如何去做。 :)来吧,不要这么苛刻。 –

回答

2

我认为这是使用未经检查的异常的好地方;任何尝试添加不兼容的款项都是由于编程错误。所以,我建议:从RuntimeException

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

由于IllegalArgumentException导出,你并不需要声明的是,add()方法把它扔了。

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

4
throw new Exception("Currencies are incompatible"); 

不过,我会考虑创建一个APP-或Money特异性异常,而不是,继承或者ExceptionRuntimeException根据您的需要。

也许MoneyConversionException延伸MoneyException如果事情必须细化。

+1

这是一个非检查异常的好地方,但自定义运行时异常是一个坏主意。他们鼓励抽象抽象。 – erickson

0

是应该抛出任何Exception的方法需要抛出子句:

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

在该方法中,您需要筛选出您想要的异常被抛出的情况下(如果-子句示例)中,然后去:

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

在这个例子中,MoneyException是扩展异常的类:

class MoneyException extends Exception {..} 
1

正如其他人所提到的,在您的处置资源的负载(例如, this)。无论如何,除此之外,我会警惕抛出自定义异常。相反,抛出一个现有的(例如IllegalArgumentException),以尽量减少复杂性。

0

抛出一个例外是关于报告错误,并已被宣布作为方​​法声明的一部分。例如:

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

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