9

私は一般的な 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){
                }
    }
}
4

4 に答える 4

17

次の行:

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)

于 2013-08-26T14:17:18.427 に答える
6

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

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

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

  1. Surresh Atta の提案を参考にしてください。インデックスが 1 ではなく 0 で始まるため、i < meString.size()代わりに使用してください。i <= meString.size()
  2. Ankit の提案を参考にして、拡張された for ループを使用してください: for(String str : meString).
于 2013-08-26T14:38:39.893 に答える