首先我要告诉:
以下是我的代码:
*。XHTML
<rich:column>
<h:selectBooleanCheckbox id="resolveTxn" value="#{verifyTransactionBean.checked[verifyTxnList.id]}"/>
</rich:column>
.
.//Some code here
.
<h:commandButton value="Resolve" action="#{verifyTransactionBean.resolveToTxn}" styleClass="btn" />
以下是我的代码
private Map<Long, Boolean> checked = new HashMap<Long, Boolean>();
public void resolveToTxn() {
List<ToVerifyTxnDTO> list = new ArrayList<ToVerifyTxnDTO>();
for (ToVerifyTxnDTO dTO : toVerifyTxnDTOList) {
if(checked.get(dTO.getId())){//I got null pointer exception here
Long id=dTO.getId();
verifyTransactionSessionBeanLocal.updateResolvedflag(id);
}
}
}
我想做什么?
我想将检查过的行ID作为参数传递给以下内容:
verifyTransactionSessionBeanLocal.updateResolvedflag(id);
点击按钮Resolve
后,应完成一些操作并刷新dataTable
并显示相同的页面。操作已完成,但在显示(翻译)同一页面时获取null pointer exception
谢谢
答案 0 :(得分:1)
如果if ()
本身实际上是Boolean
而不是NullPointerException
或{{1},Boolean
上的null
测试会抛出true
}}。换句话说,false
由于某种原因意外返回checked.get(dTO.getId())
。
这可能有几个原因:
null
的值正确更新checked
地图。<h:selectBooleanCheckbox>
而不是Boolean
。boolean
在此过程中发生了不兼容的变化,导致当前迭代的toVerifyTxnDTOList
不是表中显示的那个复选框被点击的时刻(可能因为bean是请求范围而不是视图范围)。dTO
包含的项目多于toVerifyTxnDTOList
地图中显示的项目,因为您使用的是分页并且一次只显示一个子集。在任何情况下,要修复checked
,只需添加额外的空检查:
NullPointerException
然而,这并不能解决问题的根本原因。我最好的猜测是Boolean dtoChecked = checked.get(dTO.getId());
if (dtoChecked != null && dtoChecked) {
// ...
}
包含的项目多于实际显示在表格中的项目。因此,它是列表中提到的最后提到的两个原因之一。首先提到的两个原因在理论上是可行的,但实际上我之前没有看到过这个原因。