支持添加&与其他Money对象的减法
如果货币不兼容,则抛出异常。
嗯..我已经有了一个带有add()的钱类。在这种情况下,我究竟如何抛出异常?我的意思是,我知道怎么做try {} catch但我应该去哪里做?我是否在同一个班级上这样做?或者是否应该在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);
}
}
答案 0 :(得分:4)
throw new Exception("Currencies are incompatible");
但是,我会考虑创建一个app或Money
特定的异常,根据您的需要对Exception
或RuntimeException
进行子类化。
如果事情必须是精细的,那么MoneyConversionException
可能会延长MoneyException
。
答案 1 :(得分:2)
我认为这是使用未经检查的异常的好地方;任何添加不兼容的钱的尝试都是由编程错误引起的。所以我建议:
if (!compareCurrency(moneyToBeAdded))
throw new IllegalArgumentException("Mismatched currencies.");
由于IllegalArgumentException
派生自RuntimeException
,因此您无需声明add()
方法可以抛出它。
不创建RuntimeException
的自定义子类。当应用程序尝试从特定错误中恢复时,自定义异常类型很有用,而不是仅使用相同的日志记录或警报机制来处理每个异常。程序不应该尝试从这样的特定编程错误中恢复。
答案 2 :(得分:1)
正如其他人所提到的,您可以随意使用大量资源(例如this)。无论如何,除此之外,我要警惕抛出自定义异常。相反,抛出现有的(例如IllegalArgumentException
)以便最小化复杂性。
答案 3 :(得分:0)
一个应该抛出任何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 {..}
答案 4 :(得分:0)
答案 5 :(得分:0)
抛出异常是关于报告错误,并且必须将其声明为方法声明的一部分。例如:
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);
}
}
}