经过多次SQL查询后出现NullPointerException

时间:2014-02-03 16:57:13

标签: java sql hibernate

我有一种奇怪的行为:

我有一个从数据库中获取一些数据的方法

public void calculate(Run run, Map<String, Curve> epe) {
    for (Entry<String, Curve> entry : epe.entrySet()) {
        Entity ntt = leDAO.getById(entry.getKey(), run);

        double lgd = leDAO.getLgd(ntt, run);
        Curve dp = curveDAO.getDp(entry.getKey(), run);
        String currency = leDAO.getCurrency(ntt, run);
        Curve df = curveDAO.getDf(currency, run);

        double val = 0.0;
        for (int i = 0; i < pd.size(); i++) {
            cva += entry.getValue().get(i) * df.get(i) * dp.get(i);
        }
        val *= lgd;
    }
}

调试时,在外循环的中途,它在此行停止,虽然我没有设置断点:

double lgd = leDAO.getLgd(ntt, run);

然后,它抛出一个NullPointerException,除了我找不到什么是null(leDAO,ntt和run都被设置为null以外的东西)。 我无法进入getLgd()方法(如果我这样做,我从Thread.class进入dispatchUncaughtException())。 地图有大约150个键。

修改 getLgd()方法:

public Double getLgd(Entity entity, Run run) throws HibernateException {
    if (session == null) {
        session = sessionFactory.openSession();
    }
    SQLQuery select = session.createSQLQuery(RECOVERY_SELECT);
    select.setLong(0, run.getRunId());
    select.setString(1, entity.getId());
    BigDecimal result = (BigDecimal) select.uniqueResult();
    Double lgd = null;
    if (result != null) {
        entity.setRr(result);
        BigDecimal one = new BigDecimal(1);
        BigDecimal normalLgd = one.subtract(result);
        lgd = normalLgd.doubleValue();
    }
    return lgd;
}

1 个答案:

答案 0 :(得分:1)

这是空指针异常的潜在原因:

public Double getLgd(... stuff)
{
    Double lgd = null;
    if (result != null)
    {
        ... blah
    }

    return lgd;
}


double ILikeNullPointerExceptionsWhenResultIsNull = getLgd();

Double值到double值的自动码片转换包括Double值的隐式解除引用。例如:

Double blam = null;
double hoot;

hoot = blam;

声明hoot = blamhoot = blam.doubleValue()没有区别。上面的blam变量的取消引用将导致NullPointerException。