I'm a general 3D artist, switched from my career and started to learn programming. I've got a problem with c106a handout #5.
The code works, but I've still got some error log here.
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)
Why does Arraylist
, which can stretch its capacity on its own, still get an OutOfBoundsException
?
Here's my full code:
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){
}
}
}
The index of an ArrayList is zero-based. Thus, to replace the first element, 0 must be the index passed as a parameter. The IndexOutOfBoundsException will occur if the provided index is out of bounds.
Class IndexOutOfBoundsExceptionThrown to indicate that an index of some sort (such as to an array, to a string, or to a vector) is out of range. Applications can subclass this class to indicate similar exceptions.
The ArrayIndexOutOfBounds exception is thrown if a program tries to access an array index that is negative, greater than, or equal to the length of the array. The ArrayIndexOutOfBounds exception is a run-time exception. Java's compiler does not check for this error during compilation.
The following lines:
for (int i = 0; i <= meString.size(); i++) {
System.out.println(meString.get(i));
}
should be:
for (int i = 0; i < meString.size(); i++) {
System.out.println(meString.get(i));
}
This is because the index of the list starts from zero.
Index: 4, Size: 4
explains a little more. When you call get(4)
, an exception occurs because your list only has a size of 4. get(4)
would attempt to access the 5th element in the list.
Valid elements you can access would be get(0)
, get(1)
, get(2)
, get(3)
.
You asked, "Why does Arraylist, which can stretch its capacity by its own still get an OutOfBoundsException ???"
The answer is: an ArrayList only stretches its capacity when:
.add(Object o)
)..addAll(Collection c)
)..ensureCapacity(int minCapacity)
).The trouble you're having is that you are trying to access an object in an index of the list that doesn't exist. While an ArrayList will dynamically resize when you change the contents, it won't do it when you are simply trying to access the contents.
That is the difference.
To avoid accessing an index that doesn't exist:
i < meString.size()
instead of i <= meString.size()
because the index starts with 0 instead of 1.for(String str : meString)
.Use the above answer, or you can use a foreach loop:
for (String str: meString) {
System.out.println(str);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With