Java Arraylist得到java.lang.IndexOutOfBoundsException?

Vit*_*ori 6 java exception arraylist outbound

我是一名普通的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)
Run Code Online (Sandbox Code Playgroud)

为什么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){
                }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*tta 15

以下行:

for (int i = 0; i <= meString.size(); i++) {
    System.out.println(meString.get(i));
}
Run Code Online (Sandbox Code Playgroud)

应该:

for (int i = 0; i < meString.size(); i++) {
    System.out.println(meString.get(i));
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ank*_*kit 6

使用上面的答案,或者您可以使用foreach循环:

for (String str: meString) {
    System.out.println(str);
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*unn 6

你问,"为什么Arraylist,它可以通过它自己的容量扩展仍然得到OutOfBoundsException ???"
答案是:ArrayList仅在以下情况下扩展其容量:

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

您遇到的麻烦是您尝试访问列表中不存在的索引中的对象.当您更改内容时,ArrayList将动态调整大小,但当您只是尝试访问内容时,它将不会执行此操作.
这就是区别.
要避免访问不存在的索引:

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