私は一般的な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はchangeの内容を動的にサイズ変更しますが、単にaccessの内容を変更しようとした場合はサイズ変更しません。
それが違いです。
存在しないインデックスへのアクセスを回避するには:
i < meString.size()
ではなくi <= meString.size()
を使用してください。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が発生する可能性があります