[英]Java Arraylist got 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<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){
}
}
}
以下几行:
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)
。
使用上面的答案,或者您可以使用foreach 循环:
for (String str: meString) {
System.out.println(str);
}
你问,“为什么可以自行扩展容量的 Arraylist 仍然得到 OutOfBoundsException ???”
答案是:ArrayList 仅在以下情况下扩展其容量:
.add(Object o)
)。.addAll(Collection c)
)。.ensureCapacity(int minCapacity)
)。 您遇到的问题是您试图访问不存在的列表索引中的对象。 虽然当您更改内容时 ArrayList 会动态调整大小,但当您只是尝试访问内容时它不会这样做。
这就是区别。
为避免访问不存在的索引:
i < meString.size()
而不是i <= meString.size()
因为索引从 0 而不是 1 开始。for(String str : meString)
。如果您使用的是 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.