Java Arraylist获得Java.lang.IndexOutOfBoundsException?

Java Arraylist获得Java.lang.IndexOutOfBoundsException?,java,exception,arraylist,outbound,Java,Exception,Arraylist,Outbound,我是一名普通的3D艺术家,从我的职业生涯中转型,开始学习编程。 我对c106a讲义有问题 代码运行正常,但我这里仍然有一些错误日志 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) a

我是一名普通的3D艺术家,从我的职业生涯中转型,开始学习编程。 我对c106a讲义有问题

代码运行正常,但我这里仍然有一些错误日志

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){
                }
    }
}
导入acm.io.*;
导入acm.program.ConsoleProgram;
导入acm.util.*;
导入java.io.*;
导入java.util.ArrayList;
导入java.lang.*;
公共类UniqueNames扩展控制台程序{
静态ArrayList meString=新ArrayList();
静态字符串输入;
公共静态void storeUnique(字符串输入){
如果(!meString.contains(输入))
{
meString.add(输入);
}
}
公共静态void showUnique(ArrayList meString){
System.out.println(“唯一名称列表包含:”);
对于(int i=0;i以下行:

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

对于(int i=0;i使用上述答案,或者您可以使用:

您曾问,“为什么Arraylist本身可以扩展其容量,但它仍然有一种边界外的感觉?”
答案是:ArrayList仅在以下情况下扩展其容量:

  • 向其中添加对象(
    .add(object o)
  • 您可以向其中添加另一个集合的内容(
    .addAll(集合c)
  • 确保其大小(
    .ensureCapacity(int minCapacity)
  • 您遇到的问题是,您试图访问列表索引中不存在的对象。当您更改内容时,ArrayList将动态调整大小,但当您仅尝试访问内容时,ArrayList将不会这样做。
    这就是区别。
    要避免访问不存在的索引,请执行以下操作:


  • 采纳萨里什·阿塔的建议:使用
    i
    而不是
    i如果您使用的是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));
            }
        }
    
    for(int i=0;i
    
    for (String str: meString) {
        System.out.println(str);
    }
    
     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));
            }
        }