Java 索引越界异常:无法确定发生了什么?学校作业
这是我第一次使用stackoverflow来回答我需要问的问题,希望能得到一些帮助。这是我正在做的一项学校作业,虽然我已经交了,而且很快就会对代码进行大幅度的修改,但我想先找出哪里出了问题。这基本上是一个采购历史记录程序,其中存储了过去的采购,可以通过“下一步”和“上一步”按钮作为收据访问。没有文件访问,所有数据都是随机生成的。随机数据生成不是作业的要求,但我想以此作为一种学习体验 关于这个问题,这个错误是怎么回事Java 索引越界异常:无法确定发生了什么?学校作业,java,arrays,arraylist,indexoutofboundsexception,Java,Arrays,Arraylist,Indexoutofboundsexception,这是我第一次使用stackoverflow来回答我需要问的问题,希望能得到一些帮助。这是我正在做的一项学校作业,虽然我已经交了,而且很快就会对代码进行大幅度的修改,但我想先找出哪里出了问题。这基本上是一个采购历史记录程序,其中存储了过去的采购,可以通过“下一步”和“上一步”按钮作为收据访问。没有文件访问,所有数据都是随机生成的。随机数据生成不是作业的要求,但我想以此作为一种学习体验 关于这个问题,这个错误是怎么回事 Exception in thread "AWT-EventQueue-
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)
这里有很多代码,可能太多了,无法在这里发布,因此这里有一个指向源代码的链接:
以下是发生错误的代码点:
位于farmmark.Storage.getItems(Storage.java:36)
在farmmark.Gui.buttonActionNext(Gui.java:415)
在farmmark.Gui$ButtonHandler.actionPerformed处(Gui.java:631)
任何帮助都会很好,请记住,我用java编程才8周:p。高级版谢谢 您需要查看
farmmark.Gui$ButtonHandler.actionPerformed(Gui.java:632)
,并查看该值被传递到Gui.buttonActionNext()
,因为该值被传递到Storage.getItems()
,最终命名了一个大于列表大小(-1)的索引
列表中也可能没有要开始的项(Storage.itemList
),在这种情况下,无论传递的值如何,都会出现此异常
at farmmark.Storage.getItems(Storage.java:36)
方法如下:
public static String[] getItems(int select)
{
return itemList.get(select);
}
选择的值小于零或大于(itemList.length-1)
在调试器中运行,在该行设置断点,然后查看发生了什么
我看不到itemList或select设置在哪里。我们也来看看这些方法
只是好奇-为什么这个方法是静态的?好吧,看来你还有很多东西要学。
在尝试访问列表项之前,先包装一个小复选框,如下所示:
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");
}
}
publicstaticstring[]getItems(int-select)
{
如果(选择
然后,尝试找出调用代码试图访问不存在的项的原因。阅读堆栈跟踪,它将准确地告诉您问题所在。itemList.get(select)
是选择一些超出列表范围的索引。select
的值是什么?您是否尝试过使用调试器检查您的程序?您提供的链接会弹出带有“病毒警报”消息的(假)弹出窗口…是的,我一直尝试调试它,但没有成功,在运行程序时,除非运行到某一行代码,否则无法在NetBeans中显示变量,这对我没有帮助。Louis-select的值将是计数器(收据编号),它表示假定生成的10种不同收据。您应该记住,数组从索引0开始,因此如果您有一个包含10个元素的数组,则对象1位于索引0,最后一个对象位于索引9。OBS:这只是一个学习练习。。。您不希望抛出这样的异常(否则,您不需要检查,只需让列表实现继续抛出IndexOutOfBoundsException即可)。。。但这只是简单地说明了问题:您无法访问等于或大于列表大小的索引,因为索引从0开始,以list.size()-1结束。祝你好运。谢谢,我试试看!我还没有尝试过异常处理。除了Gui类之外,我的大部分内容都是静态的,我想这就是我一直在编写代码并坚持使用它的方式。我本以为它是类成员;您的方式现在还可以。select的值一直作为我的数组中不存在的数字传递,正如您所说。我消除了一些不需要的数组和计数器,解决了这个问题。谢谢:)。
at farmmark.Storage.getItems(Storage.java:36)
public static String[] getItems(int select)
{
return itemList.get(select);
}
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");
}
}