Java Arraylist得到了java.lang.IndexOutOfBoundsException?

我是一名普通的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 meString = new ArrayList(); static String input ; public static void storeUnique(String input){ if (!meString.contains(input)) { meString.add(input); } } public static void showUnique(ArrayList 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){ } } } 

以下行:

 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) ,会发生exception,因为你的列表只有4的大小.get get(4)会尝试访问列表中的第5个元素。

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

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

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

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

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

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

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

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

  for(int i=0;i()); for(int j=0;j 

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

如果未正确完成实例化,则可能导致IndexOutOfBoundsException