2012-05-22 37 views
1

這是我第一次使用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

這裏是代碼點在錯誤發生時:

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

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

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

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

在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 。先謝謝了!

+2

'itemList.get(select)'選擇一個超出列表邊界的索引。 'select'的價值是什麼? –

+1

您是否嘗試過使用調試程序執行程序? – Zavior

+0

您提供的鏈接帶有「病毒警報」消息(虛假)彈出窗口... – Attila

回答

0

這裏的地方看看:

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

這裏的方法:

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

select的值是小於零或大於。

在調試器中運行,在該行設置斷點,並查看發生了什麼。

我看不到itemList或select設置在哪裏。看看這些方法。

只是好奇 - 爲什麼該方法是靜態的?

+0

我的大部分東西都是靜態的,除了在Gui類中,我想這是我一直在寫我的代碼,並堅持下去。 – JonJRYJo

+0

我本來期望它是一個班級成員;你現在的方式很好。 – duffymo

+0

正如你所說,select的值一直保持被傳遞爲我的數組中不存在的數字。我刪除了一些不需要的數組和一些計數器,解決了這個問題。謝謝 :)。 – JonJRYJo

0

你需要看看farmmark.Gui$ButtonHandler.actionPerformed(Gui.java:632),看到值傳遞給Gui.buttonActionNext(),因爲該值上Storage.getItems()這最終命名的指數比列表(-1)的大小通過。

也可能有在名單(Storage.itemList)開始與沒有項目,在這種情況下,你會得到這個例外,無論通過通值

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"); 
    } 
} 

然後,嘗試找出爲什麼調用代碼試圖訪問一個不存在的項目。閱讀堆棧跟蹤,它會告訴你問題的確切位置。

+0

OBS:這只是一個學習練習......你不想拋出這樣的異常(否則,你不需要檢查,只是讓List實現繼續拋出IndexOutOfBoundsException)......但是這個只是簡單地解決了問題:由於索引從0開始並以list.size() - 1結束,因此無法訪問等於或大於列表大小的索引。祝你好運。 – Renato

+0

謝謝,我會盡力的!我還沒有嘗試異常處理。 – JonJRYJo