如何解决 IndexOutOfBoundsException:索引 1 无效,大小为 1? [复制]

Posted

技术标签:

【中文标题】如何解决 IndexOutOfBoundsException:索引 1 无效,大小为 1? [复制]【英文标题】:How to resolve IndexOutOfBoundsException: Invalid index 1, size is 1? [duplicate] 【发布时间】:2016-10-09 13:55:48 【问题描述】:

我刚刚收到 java.lang.IndexOutOfBoundsException: 但不明白它是由什么引起的。基本上,我正在将 sqlite 表的记录集成到列表视图中。 这是我从表中获取记录的 sql 查询。

public ArrayList<Integer> getRecordsCount(int no) 

    ArrayList<Integer> count = new ArrayList<>();

    Cursor c = database.rawQuery(
            "select count(*) as TotalCount, tDate, " +
                    "strftime('%d', tDate) as DayPart, " +
                    "strftime('%m', tDate) as MonthPart, " +
                    "strftime('%Y', tDate) as YearPart " +
                    "from library " +
                    "where type = '" + no + "' " +
                    "group by MonthPart, YearPart", null);

    while (c.moveToNext()) 
        count.add(c.getInt(0));
    

    return count;

这是我检索该数据的方法:-

public void setDataInList(int no) 

    if (no == 0) 

        ArrayList<Integer> count = helper.getRecordsCount(1);

        mainGetLibraryModels.clear();
        MainLibraryModelWS modelWS = helper.getAllRecordsMonthWise2(no);
        for (int i = 0; i < modelWS.getRecords().size(); i++) 

            WSLibraryModel model = new WSLibraryModel();
            model.setAmount(modelWS.getRecords().get(i).getAmount());
            model.setTotalCount("" + count.get(i));
            model.setYearPart(modelWS.getRecords().get(i).getYearPart());
            model.setMonthPart(modelWS.getRecords().get(i).getMonthPart());

            mainGetLibraryModels.add(model);

        
        adapter.notifyDataSetChanged();

     else if (no == 1) 

        ArrayList<Integer> count = helper.getRecordsCount(2);

        mainGetLibraryModels.clear();
        MainLibraryModelWS modelWS = helper.getAllRecordsMonthWise2(no);
        for (int i = 0; i < modelWS.getRecords().size(); i++) 

            WSLibraryModel model = new WSLibraryModel();
            model.setAmount(modelWS.getRecords().get(i).getAmount());
            model.setTotalCount("" + count.get(i));
            model.setYearPart(modelWS.getRecords().get(i).getYearPart());
            model.setMonthPart(modelWS.getRecords().get(i).getMonthPart());

            mainGetLibraryModels.add(model);
        
        adapter.notifyDataSetChanged();

     else 

        mainGetLibraryModels.clear();
        MainLibraryModelWS modelWS = helper.getAllRecordsMonthWise2(no);
        for (int i = 0; i < modelWS.getRecords().size(); i++) 

            WSLibraryModel model = new WSLibraryModel();
            model.setAmount(modelWS.getRecords().get(i).getAmount());
            model.setTotalCount(" - ");
            model.setYearPart(modelWS.getRecords().get(i).getYearPart());
            model.setMonthPart(modelWS.getRecords().get(i).getMonthPart());

            mainGetLibraryModels.add(model);

        
        adapter.notifyDataSetChanged();

    
 

但是,当我运行这段代码时,它给了我这个错误?

FATAL EXCEPTION: main Process: com.teezom, PID: 14168
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
    at java.util.ArrayList.get(ArrayList.java:308)

【问题讨论】:

因为count数组大小为1所以需要按0索引访问 【参考方案1】:

首先使用switch 而不是if-else 分支,因为我从查询中看到的结果会将结果的固定数量作为数组提供(切换更有效并提高可读性)。

public void setDataInList(int no)   //just a suggestion not a answer

  switch (no)
     case 0 :   
          //Your Code as you specified in your code context.
           break;
     case 1 :
          //Your Code as you specified in your code context.

          break;
     case 2 :
          //Your Code as you specified in your code context.

         break;
    default :
         break;
   

如果您看到您的Exception StackTrace 并在您轻松获得解决方案后调试应用程序,现在就来解决您的问题。

这就是你的堆栈跟踪所说的--

java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1

希望您知道这个流行的异常 IndexOutOfBoundsException 仅在您尝试访问数组中不存在的任何数组索引时出现。

现在您的错误消息清楚地表明您的Array 大小是one。这意味着您的数组只能通过索引zero (0) 访问。

所以,请调试您的代码并尝试找出实际上是哪一行代码产生了异常

【讨论】:

【参考方案2】:

而不是这个:

ArrayList<Integer> count = helper.getRecordsCount(1);

试试这个:

ArrayList<Integer> count = helper.getRecordsCount(0);

【讨论】:

不,我不能。我正在使用那个 no 获取记录 @MaheshBpsk 要访问第一个位置的元素,您应该访问 0 处的元素。索引从 0 开始。您正在检查是否 (no == 0) 并发送 1 以访问记录。并且在第二个 if 而不是 2 中放 1.【参考方案3】:

首先,您需要避免多次调用 getRecords()。它会降低性能并且可能不会返回相同的结果——这可能是您出错的原因。相反,引入一个本地参数作为此函数的缓存输出并使用它。

【讨论】:

这应该是一条评论。此外,您实际上并没有回答 OP 提出的问题。 我的声誉

以上是关于如何解决 IndexOutOfBoundsException:索引 1 无效,大小为 1? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 java.util.List 中的任意位置插入

云原生景观:可观察性和分析解决了什么问题?如何解决的?

如何解决 Ajax 跨域请求不到的问题

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题