简体   繁体   中英

ArrayList index out of bounds exception

Recently while using arrayList I found a weird issue. I want to keep 2 elements in the arraylist and would like to keep object1 in element 0 and object2 in element1.

I am deciding this in a loop.

When it happens to add the first element its throwing indexOutofBounds. As per java doc as the index is greater than size its doing this.

public static void main(String[] args) 
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add(1,"SECONDITEM"); // throwing  due to size is not set
        list.add(0,"FIRSTITEM");

        int postn=0;
        for(String item:list){

            System.out.println("Position "+postn+" :"+item);
            postn++;
        }
    }

Then I tried to setup other items as placeholder in 0,1 element and tried to do same

    public static void main(String[] args) 
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add(0,"x");
        list.add(1,"y");

        list.add(1,"SECONDITEM");

        list.add(0,"FIRSTITEM");

        int postn=0;
        for(String item:list){

            System.out.println("Position "+postn+" :"+item);
            postn++;
        }
    }

    Output:
    Position 0 :FIRSTITEM
    Position 1 :x
    Position 2 :SECONDITEM
    Position 3 :y

How to get over this issue. One way I found is to remove the element in the index and add the element. Is there a better option.

public static void main(String[] args) 
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add(0,"x");
        list.add(1,"y");
        list.remove(1);
        list.add(1,"SECONDITEM");
        list.remove(0);
        list.add(0,"FIRSTITEM");

        int postn=0;
        for(String item:list){

            System.out.println("Position "+postn+" :"+item);
            postn++;
        }
    }

    Position 0 :FIRSTITEM
    Position 1 :SECONDITEM

.add() method insert the element at the given position and shift the other element accordingly

to overwrite the value at particular index you have to use the .set(position, value)

try the set method ..

    list.add(0,"x");
    list.add(1,"y");

    list.set(1,"SECONDITEM");

    list.set(0,"FIRSTITEM");

now it will return the only two values.

The issue is ... you're trying to use a List in a way it wasn't intended to be used. As you've found out, you can't set or add to an index that is outside the range of the current size.

If you know in advance the size you need and it's a fixed size, using a String[] is the better choice.

If you really want/need a dynamic structure that allows random access sets regardless of the current size, write your own method to fill the list when needed:

public static <T> void fillAndSet(int index, T object, List<T> list) 
{
    if (index > (list.size() - 1))
    {
        for (int i = list.size(); i < index; i++)
        {
            list.add(null);
        }
        list.add(object);
    }
    else
    {
        list.set(index, object);
    }
 }


When you call in this order:

ArrayList<String> list = new ArrayList<String>();
list.add(1,"SECONDITEM"); // throwing  due to size is not set

You are trying to add to position "1", but nothing has been added to the list yet. I believe that is why you get the error. Instead you probably want to use just:

ArrayList<String> list = new ArrayList<String>();
list.add("FIRSTITEM");

Since it's an empty list. You can also use the index, but you'll have to increment each time. Makes sense?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM