index out of bounds exception in ArrayList

31,316

Solution 1

Index intialization should be:

int index = 0;

Because the values of the index are between 0 and lenght-1

Solution 2

The smallest change that would let you run the code without exceptions is, as others have already pointed out, setting index at 0. But I would also completely rewrite your for loop, in what I think is a better coding style.

int dataSize = val.size();
pieChart = new PiePanel(dataSize);
for (int i = 0; i < dataSize; i++) {
    pieChart.addSlice(col.get(i), val.get(i));
}

You don't need to use an Iterator, since you never access it inside the for loop. Better use a numeric index instead, which you can introduce inside the for definition and have it automatically incremented at each pass through the loop.

Solution 3

In addition to what the others have said, you nowhere increment your iterator:

for (Iterator<Float> i = val.iterator(); i.hasNext(); ) {
    pieChart.addSlice(col.get(index), val.get(index));
    index++;
}

You need to do the following, otherwise this loop will never terminate.

for (Iterator<Float> i = val.iterator(); i.hasNext(); i.next()) …

But it’s not clear what you need this iterator for anyway.

Solution 4

The exception is showing that you are trying to access index 2, but the list is only of size 2. Initialize your index variable to 0, as list indexes (like array indexes) start with 0 and run up to size()-1.

Solution 5

index variable should start from 0. If the size of the array is n then it's index starts from 0 to n-1.

Share:
31,316
Andrew delgadillo
Author by

Andrew delgadillo

Updated on July 05, 2020

Comments

  • Andrew delgadillo
    Andrew delgadillo almost 4 years

    Here is the error message I get:

    Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
        at java.util.ArrayList.RangeCheck(ArrayList.java:547)
        at java.util.ArrayList.get(ArrayList.java:322)
        at pie.chart.explorer.alpha.ShowPieChart.<init>(ShowPieChart.java:28)
        at pie.chart.explorer.alpha.PieChartMain.jButton2ActionPerformed(PieChartMain.java:101)
        at pie.chart.explorer.alpha.PieChartMain.access$100(PieChartMain.java:22)
        at pie.chart.explorer.alpha.PieChartMain$2.actionPerformed(PieChartMain.java:63)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    BUILD SUCCESSFUL (total time: 14 seconds)
    

    And here is the code:

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package pie.chart.explorer.alpha;
    
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.util.ArrayList;
    import java.util.Iterator;
    import javax.swing.JFrame;
    
    /**
     *
     * @author Andrew
     */
    public class ShowPieChart extends JFrame {
    
        PiePanel pieChart;
    
        public ShowPieChart(ArrayList<Float> val, ArrayList<Color> col) {
            super("Pie Chart");
            int index = 1;
            setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            FlowLayout flow = new FlowLayout();
            pieChart = new PiePanel(val.size());
            for(Iterator<Float> i = val.iterator(); i.hasNext(); )  {
             pieChart.addSlice(col.get(index), val.get(index));
             index++;
            }
            setLayout(flow);
            add(pieChart);
            setVisible(true);
        }
    }
    

    I have tried lots of things to fix this problem, but I can't tell why I still keep getting an IndexOutOfBoundsException. To the best of my knowledge, I am pretty sure this is correct! Can you help?

    • stuartmclark
      stuartmclark almost 13 years
      You tried setting the index to 0 instead of 1?
    • Andrew Thompson
      Andrew Thompson almost 13 years
      +1 Well specified question. :-)
  • Bob Barbara
    Bob Barbara almost 13 years
    Also, since it doesn't seem you really need ArrayList instances as parameters, you may want to modify your constructor's parameter types to just be List<Float> and List<Color>.