这是我第一次使用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。先谢谢!
答案 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");
}
}
然后,尝试找出调用代码试图访问不存在的项的原因。阅读堆栈跟踪,它会告诉您问题的确切位置。