【问题标题】:Array error Exception, How do I fill ArrayList? [closed]数组错误异常,如何填写 ArrayList? [关闭]
【发布时间】:2016-01-17 08:12:28
【问题描述】:

这不可能是这里的问题。

D/AndroidRuntime: 关闭虚拟机 --------- 崩溃开始 java.lang.IndexOutOfBoundsException:索引 3 无效,大小为 3

   private void setupContButton(){
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ArrayList<String> list= new ArrayList<String>();
            Log.e("SIZE  LIST", "list: " + list.size());
               for (i = 0 ; i <= list.size(); i++){
                   list.add(adapter.getItem(i).getName());
                   Log.e("Info", "Position: " + 1 + " Content: " + list.get(i) + " SIZE: " + list.size());
               }
        }
    });}

切换到大家给我的解决方案,现在再也没有进入循环

W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST 被客户端拒绝

ArrayList<String> list= new ArrayList<String>();
               for (i = 0 ; i < list.size(); i++){
                   list.add(adapter.getItem(i).getName());
                   Log.e("Info", "Position: " + i + " Content: " + list.get(i) + " SIZE: " + list.size());
               }

【问题讨论】:

  • 异常告诉你确切的问题。您试图从只有索引 0、1、2 的数组中获取索引 3。我可以从这里看到问题(提示:修复您的 for 循环)。
  • for (i = 0 ; i &lt;= list.size(); i++){更改为for (i = 0 ; i &lt; list.size(); i++){
  • user2747599 List 用于索引,java 中的索引以0 开头,因此如果size() 返回3,那么它只包含索引0,1 and 2 处的元素.因此,在访问3 的元素时,会抛出java.lang.IndexOutOfBoundsException
  • @StackOverflowerrr:实际上,我一开始也是这么想的。但是,这与列表大小无关,因为列表最初是空的(大小 == 0)。问题是根据我的(更新的)答案,错误的东西被用来控制循环。它应该由适配器大小而不是列表来控制。

标签: android listview arraylist listadapter


【解决方案1】:

数组索引从0 枚举,所以当你的数组是3 元素时,你不能有索引3,因此你在这一行中遇到了错误的条件:

for (i = 0 ; i <= list.size(); i++){

【讨论】:

  • 您的解决方案不起作用
  • 当然可以。如果你正确应用它
  • 我的列表从 0 (list.size () = 0) 开始增长,如果我放入循环将是 for (i = 0; i
【解决方案2】:

您看到的异常非常明确:

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

意味着您使用的索引对于您拥有的容器来说太大了。

在您的特定情况下,这是因为这段代码(稍微解释一下):

ArrayList<String> list= new ArrayList<String>();
for (i = 0 ; i <= list.size(); i++)
    list.add(adapter.getItem(i).getName());

只要i 小于或等于列表大小,它就会继续将项目添加到列表中。但是,这总是是正确的,因为列表大小的增加速度与i 相同 - 当i 变为 1 时,大小也会增加。如此循环往复(直到你得到一个例外,无论如何)。

但是,您从中获取数据的东西不是列表,它是适配器。这意味着,一旦 i 增加到等于 适配器中项目数的值, adapter.getItem(i) 就会失败,并出现您看到的异常。

解决方法是使用 适配器大小 来控制循环,因为它决定需要添加多少东西:

ArrayList<String> list= new ArrayList<String>();
for (i = 0 ; i < adapter.getCount(); i++)         // NOT list.size()
    list.add(adapter.getItem(i).getName());

请注意,我还将 &lt;= 更改为 &lt;,因为从零开始的集合的项目范围是 0..(size-1),而不是 0..size

【讨论】:

    【解决方案3】:

    改变你的for循环条件for(i=0;i&lt;list.size();i++)

    【讨论】:

    • 您的解决方案不起作用
    • 在数组列表中添加一些值,例如:- list.add("some value");
    • 我的列表从0开始增长(list.size() = 0) 如果我把循环放到for (i = 0; i
    • list.size() == 0 表示您的列表为空。进入循环没有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2017-10-17
    • 2020-01-04
    相关资源
    最近更新 更多