【问题标题】:Why does a ArrayIndexOutOfBoundsException happen here?为什么这里会发生 ArrayIndexOutOfBoundsException?
【发布时间】:2010-11-19 13:55:28
【问题描述】:

我在我的 Android 应用程序中获得了以下代码:

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

retrieveEvents() 从 Internet 获取一些 Events,因此这可能会失败,尽管为空或 null。用户可以选择要显示的Event,以避免异常我使用模运算来确保eventNr 在范围内。这适用于我在 BUT 上测试过的任何设备:

我从其他用户那里得到错误报告,其中倒数第二行(数组访问)抛出ArrayIndexOutOfBoundsException。这怎么可能发生?我没有检查什么条件?我的错误在哪里?

记住:retrieveEvents()getFromUserInput() 函数都可以返回无效数据,但我想我检查了每个案例,那么我的错在哪里?

【问题讨论】:

  • 所以你确实得到了一个ArrayIndexOutOfBoundsException?在哪条线上? Event event = events[eventNr]; 行?
  • @aioobe:是的,他说“倒数第二行(数组访问)在哪里抛出......”
  • 异常中的索引是什么?

标签: java android arrays bounds


【解决方案1】:

您是否确保eventNr 永远不会是负数?支票不在您引用的代码中。问题在于,例如,如果 eventNr-1 并且 events.length 是 5,那么 -1 % 5 = -1 和当然 events[-1] 就超出了范围。

【讨论】:

  • 不,但即使是,问题出在哪里?
  • @theomega: 如果eventNr-1events.length5-1 % 5 = -1events[-1] 超出范围。
  • -x (-5%4 = -1) 的索引 (eventNr)
  • 哦,我认为负模总是正的,但事实并非如此。谢谢!
【解决方案2】:

这是一个线程应用程序吗?是否可能 retrieveEvents() 总是返回对同一个数组的引用,但该数组正在实时修改?如果是这样,那可能是您的问题。

【讨论】:

  • 从来没有想过这个,虽然应用程序没有线程,但它可能是一个并发问题,我必须调查一下。
  • 好点。所有引用的代码看起来都像本地变量,但这可能只是引用代码的事情。至少要问一个好问题。
猜你喜欢
  • 2018-04-27
  • 2012-01-12
  • 2012-08-02
  • 1970-01-01
  • 2013-03-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多