0

I'm trying to see how many common elements two array lists have. This is the code I've come up with but this unfortunately returns: Exception in thread "AWT-EventQueue-0"

Here is the code:

private int score(int correctAnswers){ 
    correctAnswers = 0;

    Collections.addAll(quiz1Answers, "ottawa", "toronto", "tokyo", "northamerica", "seoul", "Asia", "unitedstates", "50");
    Collections.addAll(quiz1UserAnswers, "ottawa", "dfdf", "tokyo", "northamerica", "seoul", "x", "unitedstates", "50");

    for (int i = 0; i <= quiz1Answers.size(); i++)
    {
        if (quiz1Answers.contains(quiz1UserAnswers.get(i)))
        {
            correctAnswers++;

        }
    } 
    return correctAnswers;
}

How would I go about solving this?

EDIT: Here is the full error messsage:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at Quiz1.score(Quiz1.java:309)
at Quiz1.jButton4ActionPerformed(Quiz1.java:364)
at Quiz1.access$400(Quiz1.java:16)
at Quiz1$5.actionPerformed(Quiz1.java:148)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
6
  • 1
    Consider providing the full stack trace, as the error is meaningless Commented Jul 21, 2014 at 0:55
  • Looks fine to me, you might want to take a close look at where the exception occurs. Commented Jul 21, 2014 at 0:55
  • 2
    Your loop looks backwards, you are using i <= quiz1Answers.size(), but access the quiz1UserAnswers collection with quiz1UserAnswers.get(i), there's no gurentee that the two collections are the same size... Commented Jul 21, 2014 at 0:57
  • 1
    <= size() should probably be < size() Commented Jul 21, 2014 at 0:59
  • 1
    java.lang.IndexOutOfBoundsException: Index: 8, Size: 8 You try to access index 8 of a collection that has a highest index of 7. Commented Jul 21, 2014 at 1:00

1 Answer 1

1

Java ArrayList is indexable from 0 to size() - 1, when you access the element at index size() you are out of bounds.

for (int i = 0; i < quiz1Answers.size(); i++) // not <=

From the ArrayList.get(int index) JavaDoc (bold added),

Throws:

if the index is out of range (index < 0 || index >= size())

Also, your if condition appears incorrect and you should test that the index isn't outside second collection's range,

if (quiz1UserAnswers.size() < i && quiz1UserAnswers.get(i).equals(quiz1Answers.get(i)))
Sign up to request clarification or add additional context in comments.

5 Comments

Thank you!! I'm still new to Java (and programming) so I appreciate the explanation.
Could also mention that the OP is indexing the loop through the quiz1Answers collection while retrieving elements from quiz1UserAnswers - It would be better to use quiz1UserAnswers.contains(quiz1Answers.get(i)) ;)
@MadProgrammer Are you sure? Usually a test answer should be isomorphic to the question. C should not be correct if any answer is C. Unless of course C is the correct answer for a particular question. :)
Your example isn't wrong, it's just long winded (IMHO), where using something like quiz1UserAnswers.contains(quiz1Answers.get(i)) reduces the number of checks needed (to one instead of two) and solves both problems. This is just my opinion, but I think it's more readable. If you teach someone to shoot, you not only teach them which way to hold the gun, but also the direction, so they don't shoot themselves (or you) in the foot ;)
@MadProgrammer My point is "ottawa" is presumably only correct for question 1, using contains the respondent might have every answer in an incorrect order. Given OP's specific inputs that may not matter, but it is an important distinction. Swapping northamerica and asia is a pretty serious error on a geography test.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.