2010-11-19 131 views
2

我在我的Android的應用程序下面的代碼:爲什麼在這裏會發生ArrayIndexOutOfBoundsException?

Event[] events = retrieveEvents(); 
if (events != null && events.length>0) { 
    int eventNr = getFromUserInput(); 
    eventNr = eventNr % events.length; 
    Event event = events[eventNr]; 
} 

retrieveEvents()獲取從互聯網上一些Event S,所以這可能會失敗的,雖然是空的或null。用戶可以選擇要顯示哪個Event,以避免異常我使用模運算來確保eventNr在範圍內。這在我測試過的任何設備上都可以正常工作:

我從第二個最後一行(數組訪問)拋出ArrayIndexOutOfBoundsException的其他用戶處收到錯誤報告。這怎麼會發生?我沒有選擇什麼條件?我的錯誤在哪裏?

請記住:retrieveEvents()getFromUserInput()函數都可以返回無效數據,但我想我檢查了每一個案例,那麼我的錯在哪裏?

+0

所以你*做*得到一個ArrayIndexOutOfBoundsException?在哪一行? 'Event event = events [eventNr];'line? – aioobe 2010-11-19 13:58:02

+1

@aioobe:是的,他說*「第二行最後一行(數組訪問權限)拋出......」* – 2010-11-19 13:59:00

+0

異常中的索引是什麼? – starblue 2010-11-19 14:07:00

回答

7

你確定eventNr永遠不會消極嗎?該檢查不在您的引用代碼中。問題是,如果,例如,eventNr-1events.length是5,-1 % 5 = -1,當然events[-1]是超出界限。

+0

不,但即使是這樣,問題在哪裏? – theomega 2010-11-19 14:00:34

+0

@theomega:如果'eventNr'爲'-1','events.length'爲'5','-1%5 = -1'和'events [-1]'超出範圍。 – 2010-11-19 14:02:16

+0

-x(-5%4 = -1)的指數(eventNr) – teemitzitrone 2010-11-19 14:02:49

2

這是一個線程應用程序嗎?是否有可能retrieveEvents()總是返回一個對同一個數組的引用,但是這個數組正在被實時修改?如果是這樣,那可能是你的問題。

+0

從來沒有想到這一點,雖然應用程序沒有線程化,但它可能是一個併發問題,我必須調查。 – theomega 2010-11-19 14:01:38

+0

好點。所有引用的代碼*看起來像本地變量,但這可能只是一個引用代碼的東西。至少請問一個好問題。 – 2010-11-19 14:04:26

相關問題