我目前得到以下代码:
captureFile = theCaptureFile;
// If there is only 1 currency it gets the total right away
if (captureFile.getTotalMoney().size() == 1) {
Money totalMoney = captureFile.getTotalMoney().values().iterator().next();
totalAmount = totalMoney.getAmount();
currencyCode = totalMoney.getCurrencyCode();
}
// If there is more than one currency, goes through every one, converts it to GBP and adds it to the total amount
else if (captureFile.getTotalMoney().size() > 1) {
Map<String, Money> totals = captureFile.getTotalMoney();
for (Entry<String, Money> money : totals.entrySet()) {
try {
totalAmount = totalAmount + money.getValue().getEquivalent(BASE_CURRENCY).getAmount();
}
catch (CurrencyNotFoundException e) {
LOG.error("Getting ExchangeRate:", e);
totalAmount = null;
break;
}
catch (ExchangeRateNotFoundException e) {
LOG.error("Getting ExchangeRate:", e);
totalAmount = null;
break;
}
}
}
当代码被调用时,第一个IF工作正常但是,如果有超过2个货币,我在TRY位上得到一个NullPointerException。 这些方法都没有返回null,因此我猜测我在映射部分上执行的操作是错误的,以便将值拉出来。
以下是其他两种方法:
public Money getEquivalent(String targetCurrencyCode) throws CurrencyNotFoundException,ExchangeRateNotFoundException {
if (this.currencyCode.equals(targetCurrencyCode)) {
return this;
}
return getEquivalent(CurrencyCache.get().getCurrency(targetCurrencyCode));
}
和
public long getAmount() {
return amount;
}
任何帮助将不胜感激,您可能需要的任何更多信息只是让我知道。
非常感谢提前。
答案 0 :(得分:2)
由于totalAmount
可以为空,并且因为它在第一次迭代中使用,所以需要在循环之前将其设置为非null
值:
totalAmount = 0L;
Map<String, Money> totals = captureFile.getTotalMoney();
for (Entry<String, Money> money : totals.entrySet()) {
try {
totalAmount = totalAmount + money.getValue().getEquivalent(BASE_CURRENCY).getAmount();
}
...
}
如果在进入循环之前totalAmount
未设置为null
,则第一次+=
调用将导致NPE。
答案 1 :(得分:0)
你似乎在说这条线会抛出NPE。
totalAmount = totalAmount +
money.getValue().getEquivalent(BASE_CURRENCY).getAmount();
有四种方法可以实现:
如果totalAmount
被声明为Integer
(或其他原始包装类型)且它是null
,
如果money
是null
,
如果money.getValue()
返回null
,
如果money.getValue().getEquivalent(BASE_CURRENCY)
返回null
。
不幸的是,您的代码太过零碎,无法确定哪些是可能的。
getEquivalent
也有可能抛出NPE ......虽然这可以从堆栈跟踪中清楚看出。
这一行的事实:
totalAmount = totalMoney.getAmount();
不投掷NPE并不允许我们消除上述任何的可能性。