web-dev-qa-db-ja.com

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)

自分で容量を拡張できるArraylistOutOfBoundsExceptionを取得するのはなぜですか?

これが私の完全なコードです:

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){
                }
    }
}
6
Vittori

次の行:

_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)です。

15
Suresh Atta

上記の答えを使用するか、 foreachループ を使用できます:

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

自分で容量を拡張できるArraylistがOutOfBoundsExceptionを取得するのはなぜですか???
答えは次のとおりです。ArrayListは、次の場合にのみ容量を拡張します。

  1. オブジェクトをそれに追加します(.add(Object o))。
  2. 別のコレクションの内容をそれに追加します(.addAll(Collection c))。
  3. そのサイズを確認します(.ensureCapacity(int minCapacity))。

発生している問題は、存在しないリストのインデックス内のオブジェクトにアクセスしようとしていることです。 ArrayListはchangeの内容を動的にサイズ変更しますが、単にaccessの内容を変更しようとした場合はサイズ変更しません。
それが違いです。
存在しないインデックスへのアクセスを回避するには:

  1. Surresh Attaの提案に従います。インデックスは1ではなく0で始まるため、i < meString.size()ではなくi <= meString.size()を使用してください。
  2. Ankitの提案に従って、拡張されたforループfor(String str : meString)を使用してください。
6
James Dunn

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が発生する可能性があります