索引越界异常:无法弄清楚发生了什么?作业

时间:2012-05-22 00:57:35

标签: java arrays arraylist indexoutofboundsexception

这是我第一次使用stackoverflow来提出我需要提出的问题,所以希望我能得到一些帮助。这是我正在进行的一项学校作业,虽然我已经将其转入并且我将很快改变代码,但我想首先找出问题所在。这基本上是购买历史记录程序,其中存储过去的购买并且可以作为具有“下一个”和“后退”按钮的收据来访问。没有文件访问权限,所有数据都是随机生成的。随机数据生成不是作业的要求,但我想以这种方式作为学习经验。

关于这个问题,这个错误发生了什么?

    Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 9, Size: 9
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at farmmark.Storage.getItems(Storage.java:36)
at farmmark.Gui.buttonActionNext(Gui.java:415)
at farmmark.Gui$ButtonHandler.actionPerformed(Gui.java:632)
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:6290)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6055)
at java.awt.Container.processEvent(Container.java:2039)
at java.awt.Component.dispatchEventImpl(Component.java:4653)
at java.awt.Container.dispatchEventImpl(Container.java:2097)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166)
at java.awt.Container.dispatchEventImpl(Container.java:2083)
at java.awt.Window.dispatchEventImpl(Window.java:2482)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:648)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:607)
at java.awt.EventQueue$1.run(EventQueue.java:605)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:621)
at java.awt.EventQueue$2.run(EventQueue.java:619)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:618)
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: 6 seconds)

有很多代码,可能在这里发布太多了,所以这里有一个链接到源: http://www.mediafire.com/?3ogc334vwh6t7k6

以下是发生错误的代码点:

at farmmark.Storage.getItems(Storage.java:36)

public static String[] getItems(int select)
{
    return itemList.get(select);
}

at farmmark.Gui.buttonActionNext(Gui.java:415)

String items[] = Storage.getItems(counter);

at farmmark.Gui $ ButtonHandler.actionPerformed(Gui.java:631)

else if(sel.equals("Next"))
        {
            jtxtItems.setText(null);
            jtxtPrices.setText(null);
            jtxtSkus.setText(null);
            jtxtCase.setText(null);
            jtxtVend.setText(null);
            panel.removeAll();
            buttonActionNext();
        {

任何帮助都会很棒,请记住我只用Java编程了8周:P。先谢谢!

3 个答案:

答案 0 :(得分:0)

您需要查看farmmark.Gui$ButtonHandler.actionPerformed(Gui.java:632)并查看该值是否传递给Gui.buttonActionNext(),因为该值会传递给Storage.getItems(),最终会命名一个大于该值的索引列表(-1)。

列表中可能没有项目(Storage.itemList)可以开始,在这种情况下,无论传递的值是什么,您都会得到此异常

答案 1 :(得分:0)

这是在哪里看:

at farmmark.Storage.getItems(Storage.java:36)

以下是方法:

public static String[] getItems(int select)
{
    return itemList.get(select);
}

select的值小于零或大于(itemList.length-1)

在调试器中运行,在该行设置一个断点,然后看看是什么。

我没有看到itemList或select设置在哪里。看看那些方法。

好奇 - 为什么这个方法是静态的?

答案 2 :(得分:0)

好吧,看来你需要学习很多东西。 在你尝试访问这样的列表项之前,先包装一些支票,然后开始如何:

public static String[] getItems(int select)
{
    if (select < itemList.size()) {
        return itemList.get(select);
    } else {
        throw RuntimeException("We cannot access an item that does not exist");
    }
}

然后,尝试找出调用代码试图访问不存在的项的原因。阅读堆栈跟踪,它会告诉您问题的确切位置。