Java Arraylist got java.lang.IndexOutOfBoundsException?

久未见 提交于 2019-12-04 01:28:38

问题


I'm a general 3D artist, switched from my career and started to learn programming. I've got a problem with c106a handout #5.

The code works, but I've still got some error log here.

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)

Why does Arraylist, which can stretch its capacity on its own, still get an OutOfBoundsException?

Here's my full code:

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){
                }
    }
}

回答1:


The following lines:

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

should be:

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

This is because the index of the list starts from zero.

Index: 4, Size: 4 explains a little more. When you call get(4), an exception occurs because your list only has a size of 4. get(4) would attempt to access the 5th element in the list.

Valid elements you can access would be get(0), get(1), get(2), get(3).




回答2:


You asked, "Why does Arraylist, which can stretch its capacity by its own still get an OutOfBoundsException ???"
The answer is: an ArrayList only stretches its capacity when:

  1. You add an object to it ( .add(Object o) ).
  2. You add the contents of another collection to it ( .addAll(Collection c) ).
  3. You ensure its size ( .ensureCapacity(int minCapacity) ).

The trouble you're having is that you are trying to access an object in an index of the list that doesn't exist. While an ArrayList will dynamically resize when you change the contents, it won't do it when you are simply trying to access the contents.
That is the difference.
To avoid accessing an index that doesn't exist:

  1. Take Surresh Atta's suggestion: Use i < meString.size() instead of i <= meString.size() because the index starts with 0 instead of 1.
  2. Take Ankit's suggestion and just use the enhanced for loop: for(String str : meString).



回答3:


Use the above answer, or you can use a foreach loop:

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



回答4:


If you are using a 2D ArrayList ,make sure you instantiate every row and every element of the corresponding row using the following code:

 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));
        }
    }

This creates an ArrayList with i (=n) rows and each row contains an ArrayList with j (=n) number of elements.

If instantiation is not done properly it might result in an IndexOutOfBoundsException



来源:https://stackoverflow.com/questions/18446302/java-arraylist-got-java-lang-indexoutofboundsexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!