Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

index out of bounds exception in ArrayList

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?

like image 349
Andrew delgadillo Avatar asked Jul 03 '11 15:07

Andrew delgadillo


2 Answers

Index intialization should be:

int index = 0;

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

like image 181
Jiri Kriz Avatar answered Sep 20 '22 22:09

Jiri Kriz


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.

like image 41
Giulio Piancastelli Avatar answered Sep 19 '22 22:09

Giulio Piancastelli