You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中ArrayList<double[]>调用get(0)触发IndexOutOfBoundsException求助

解决Google Maps onMapReady中ArrayList获取元素崩溃的问题

我之前帮好几个开发者排查过一模一样的问题,你遇到的java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0,看似矛盾(你确认数组有数据),但本质都是时机或实例引用的问题,咱们一步步拆解:

最常见的原因:异步加载数据和onMapReady的执行顺序不匹配

你大概率是通过异步操作(比如网络请求、本地数据库查询)填充coordinatesArray的,但onMapReady是Google Maps SDK在地图加载完成后立刻触发的主线程回调——这时候你的异步任务可能还没跑完,数组自然是空的。你“100%确认有数据”,可能是在后续某个时间点看到的,但崩溃发生在数据填充之前。

解决办法:

  • 把获取第一个元素的逻辑放到数据加载完成的回调里,比如网络请求的onResponse、数据库查询的onSuccess方法中,确保数组已经被填充后再操作。
  • 如果必须在onMapReady里处理,一定要先做非空判断:
    if (!coordinatesArray.isEmpty()) {
        double[] firstCoords = coordinatesArray.get(0);
        // 你的业务逻辑
    } else {
        // 可以加日志提示,或者给用户显示加载状态
        Log.d("MapDebug", "⚠️ coordinatesArray还未加载完成,当前size:" + coordinatesArray.size());
    }
    

容易忽略的坑:操作的不是同一个ArrayList实例

有时候你可能在其他地方不小心重新初始化了coordinatesArray,比如:

// 某个方法里误写了这句,覆盖了原来的实例
coordinatesArray = new ArrayList<>();

这就导致你填充数据的是旧实例,而onMapReady里引用的是新的空实例,自然会报错。

解决办法:

  • 检查所有涉及coordinatesArray的代码,确保没有重复初始化的操作。
  • 推荐用ViewModel或者全局单例来管理这个数组,保证整个页面生命周期内引用的是同一个实例。

特殊场景:onMapReady被重复触发

当屏幕旋转、配置变化时,Google Maps可能会重新调用onMapReady,如果你的coordinatesArray没有在配置变化后恢复数据,就会变成空数组。

解决办法:

  • 在Activity/Fragment的onSaveInstanceState中保存数组数据,在onCreate或onRestoreInstanceState中恢复。
  • 用ViewModel存储数据,它会自动在配置变化时保留数据,无需手动处理。

调试小技巧

别光凭感觉判断数组是否有数据,在onMapReady开头加一段日志,实时查看当时的数组状态:

Log.d("MapDebug", "onMapReady执行,coordinatesArray size: " + coordinatesArray.size());
for (double[] coords : coordinatesArray) {
    Log.d("MapDebug", "当前坐标:" + Arrays.toString(coords));
}

日志会告诉你真相——到底是数组真的为空,还是你误以为它有数据。

内容的提问来源于stack exchange,提问作者asus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:33:49