Java NPE - 帮助摆脱它

时间:2015-03-04 10:11:46

标签: java nullpointerexception

我目前得到以下代码:

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

任何帮助将不胜感激,您可能需要的任何更多信息只是让我知道。

非常感谢提前。

2 个答案:

答案 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

  • 如果moneynull

  • 如果money.getValue()返回null

  • 如果money.getValue().getEquivalent(BASE_CURRENCY)返回null

不幸的是,您的代码太过零碎,无法确定哪些是可能的。

getEquivalent也有可能抛出NPE ......虽然这可以从堆栈跟踪中清楚看出。

这一行的事实:

totalAmount = totalMoney.getAmount();

不投掷NPE并不允许我们消除上述任何的可能性。