2010-11-19 107 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

相关问题