我有一种奇怪的行为:
我有一个从数据库中获取一些数据的方法
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;
}
答案 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 = blam
与hoot = blam.doubleValue()
没有区别。上面的blam
变量的取消引用将导致NullPointerException。