例如java.lang.IllegalArgumentException:fromIndex(XXX)> toIndex(XX)

时间:2014-02-21 12:13:30

标签: java

我有一个带有分页的jqgrid。用户可以自己输入数据到页面之间的内容。

如果用户在第199行输入的内容多于可用页面,我会收到错误,如上例所示。如何解决这个问题?

if(noOfRows != null && !recipeList.isEmpty())
        if ((noOfRows * pageNo) < recipeList.size()) {
            recipeList = recipeList.subList((noOfRows * (pageNo - 1)),
                    (noOfRows * pageNo));
        } else {
            recipeList = recipeList.subList((noOfRows * (pageNo - 1)), 
                    recipeList.size());  //line 199:  giving error
        }
    for (Recipe recp : recipeList) {
             ..............
             ..............

我试图在第199行更改代码的else部分:

  int totalCustomPagesNums=noOfRows * (pageNo - 1); 
        int firstIndex=totalCustomPagesNums < recipeIdList.size()?totalCustomPagesNums:1;
        recipeList = recipeList.subList(firstIndex,
         recipeList.size());

3 个答案:

答案 0 :(得分:4)

我会将其简化为:

  • 计算下限,必须至少为0且最多为recipeList.size()
  • 计算出独占上限,该上限必须至少为0且最多为recipeList.size()
  • 参加子列表

所以:

int start = Math.min(Math.max(noOfRows * (pageNo - 1), 0), recipeList.size());
int end = Math.min(Math.max(noOfRows * pageNo, start), recipeList.size());
recipeList = recipeList.subList(start, end);

现在你肯定知道0 <= start <= end <= recipeList.size(),所以即使用户指定奇怪的行数或页码也没关系。

答案 1 :(得分:0)

您正在尝试创建一个从索引100开始并在索引72结束的子列表。由于列表的开头位于结尾,因此您将收到IllegalArgumentException。

添加另一项检查,如果(noOfRows*pageNo < recipeList.size())

答案 2 :(得分:0)

我会在代码的开头添加两个额外的块。

if (pageNo < 1) {
    pageNo = 1;
}

if ((pageNo - 1) * noOfRows >= recipeList.size()) {
    pageNo = 1 + ( recipeList.size() - 1 ) / noOfRows;
}

如果页码太低,第一个块会修复问题。如果页码太高,第二个块会修复问题。

第二个块开头的检查确保要显示的第一个配方的索引((pageNo - 1) * noOfRows)在recipeList的范围内。内部的赋值是将pageNo设置为真实的最高值。