【问题标题】:Java Arraylist got java.lang.IndexOutOfBoundsException?Java Arraylist 得到 java.lang.IndexOutOfBoundsException?
【发布时间】:2013-08-29 01:42:28
【问题描述】:

我是一名普通的 3D 艺术家,从我的职业生涯中跳槽并开始学习编程。 我对 c106a 讲义 #5 有疑问。

代码有效,但我这里仍然有一些错误日志。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at UniqueNames.showUnique(UniqueNames.java:23)
at UniqueNames.main(UniqueNames.java:39)

为什么Arraylist,它可以自行扩展容量,仍然得到OutOfBoundsException

这是我的完整代码:

import acm.io.*;
import acm.program.ConsoleProgram;
import acm.util.*;
import java.io.*;
import java.util.ArrayList;
import java.lang.*;

public class UniqueNames extends ConsoleProgram{

  static ArrayList<String> meString = new ArrayList<String>();
  static String input ;

    public static void storeUnique(String input){
        if (!meString.contains(input))
           {
            meString.add(input);
            }
    }

    public static void showUnique(ArrayList<String> meString){
        System.out.println("Unique name list contains:");
        for(int i=0 ;i<= meString.size() ;i++){
            System.out.println(meString.get(i));
          }
      }

    public static void main(String[] args){

             try{
                InputStreamReader stream = new InputStreamReader(System.in);
                BufferedReader br = new BufferedReader(stream);
                   while (true){
                       System.out.println("Enter name:");
                       String input = br.readLine();
                       if (input.equals("")) break;
                       storeUnique(input);
                      }  

                  {showUnique(meString);}  
                }
             catch(IOException e){
                }
    }
}

【问题讨论】:

    标签: java exception arraylist outbound


    【解决方案1】:

    如果您使用的是 2D ArrayList ,请确保使用以下代码实例化每一行和对应行的每个元素:

     for(int i=0;i<n;i++)
        {
            p.add(new ArrayList<Integer>());
            for(int j=0;j<n;j++)
            {
                p.get(i).add(new Integer(0));
            }
        }
    

    这将创建一个包含 i (=n) 行的 ArrayList,并且每行包含一个包含 j (=n) 个元素的 ArrayList。

    如果实例化没有正确完成,可能会导致 IndexOutOfBoundsException

    【讨论】:

      【解决方案2】:

      以下几行:

      for (int i = 0; i <= meString.size(); i++) {
          System.out.println(meString.get(i));
      }
      

      应该是:

      for (int i = 0; i < meString.size(); i++) {
          System.out.println(meString.get(i));
      }
      

      这是因为列表的索引从零开始。

      Index: 4, Size: 4 解释更多。当您调用get(4) 时,会发生异常,因为您的列表的大小仅为 4。get(4) 将尝试访问列表中的第 5 个元素。

      您可以访问的有效元素是get(0)get(1)get(2)get(3)

      【讨论】:

        【解决方案3】:

        使用上面的答案,或者你可以使用foreach loop

        for (String str: meString) {
            System.out.println(str);
        }
        

        【讨论】:

          【解决方案4】:

          您问:“为什么可以自行扩展容量的 Arraylist 仍然会出现 OutOfBoundsException ???”
          答案是:ArrayList 仅在以下情况下才会扩展其容量:

          1. 您向其中添加一个对象 (.add(Object o))。
          2. 您将另一个集合的内容添加到其中 (.addAll(Collection c))。
          3. 您确保其大小 (.ensureCapacity(int minCapacity))。

          您遇到的问题是您试图访问列表索引中不存在的对象。虽然 ArrayList 会在您更改内容时动态调整大小,但当您只是尝试访问内容时它不会这样做。
          这就是区别。
          为避免访问不存在的索引:

          1. 采纳 Surresh Atta 的建议:使用 i &lt; meString.size() 而不是 i &lt;= meString.size(),因为索引以 0 而不是 1 开头。
          2. 采纳 Ankit 的建议,只使用增强的 for 循环:for(String str : meString)

          【讨论】:

            猜你喜欢
            • 2014-02-17
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 2020-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-29
            相关资源
            最近更新 更多