在jsf中显示一些tak之后显示相同页面时出现NullPointerException

时间:2013-09-06 05:51:23

标签: jsf

首先我要告诉:

以下是我的代码:

*。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

谢谢

1 个答案:

答案 0 :(得分:1)

如果if ()本身实际上是Boolean而不是NullPointerException或{{1},Boolean上的null测试会抛出true }}。换句话说,false由于某种原因意外返回checked.get(dTO.getId())

这可能有几个原因:

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

在任何情况下,要修复checked,只需添加额外的空检查:

NullPointerException

然而,这并不能解决问题的根本原因。我最好的猜测是Boolean dtoChecked = checked.get(dTO.getId()); if (dtoChecked != null && dtoChecked) { // ... } 包含的项目多于实际显示在表格中的项目。因此,它是列表中提到的最后提到的两个原因之一。首先提到的两个原因在理论上是可行的,但实际上我之前没有看到过这个原因。