0

首先我想说:

以下是我的代码:

*.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在显示(Reddering)同一页面时获取

谢谢

4

1 回答 1

1

如果a本身实际上是而不是or ,则对 a的if ()测试Boolean将抛出。换句话说,由于 某种原因意外返回了。NullPointerExceptionBooleannulltruefalsechecked.get(dTO.getId())null

这可能有几个原因:

  • 由于某种原因,JSF 实现没有使用checkedfrom 的值正确更新地图。<h:selectBooleanCheckbox>
  • 由于某种原因,EL 实现正在使用Boolean而不是。boolean
  • toVerifyTxnDTOList此过程中发生了不兼容的更改,导致当前迭代dTO的不是在单击复选框时显示在表中的那个(可能是因为 bean 是请求范围而不是视图范围)。
  • toVerifyTxnDTOList包含的项目多于地图中的项目,因为checked您正在使用分页并一次仅显示一个子集。

在任何情况下,要修复NullPointerException,只需添加一个额外的 nullcheck:

Boolean dtoChecked = checked.get(dTO.getId());

if (dtoChecked != null && dtoChecked) {
    // ...
}

但是,这并不能解决问题的根本原因。我最好的猜测是toVerifyTxnDTOList包含的项目比表中实际显示的要多。因此,它是列表中最后提到的两个原因之一。首先提到的两个原因在理论上是可能的,但实际上我以前从未见过。

于 2013-09-06T11:26:28.793 回答