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

Firestore onComplete获取列表后创建二维数组时应用崩溃求助

问题排查与解决思路

1. 异步操作时机错误

Firestore的get()是异步方法,数据读取完成前coordPlaces是空列表。如果把二维数组的创建代码放在onCallback方法外部,会因为列表为空导致数组初始化失败或越界。必须将这段代码放在onCallback内部,确保数据已经加载完成。

2. 二维数组未初始化

你只对graph[i][j]赋值,但没有先创建对应大小的二维数组。空数组直接赋值会触发NullPointerException。需要在循环前根据coordPlaces的大小初始化数组:

int size = coordPlaces.size();
int[][] graph = new int[size][size];

3. 数组越界与逻辑错误

  • 循环中使用coordPlaces.get(i+1),当i等于coordPlaces.size()-1时,i+1超出列表索引范围,会抛出IndexOutOfBoundsException。
  • 内层循环遍历j但始终计算i和i+1的距离,逻辑不符合二维数组存储两两地点距离的需求,应该计算i和j对应地点的距离。

修正后的完整代码

db = FirebaseFirestore.getInstance();
readData(new FirestoreCallback() {
    @Override
    public void onCallback(List<LatLng> myList) {  
        int size = myList.size();
        // 空数据判断,避免后续错误
        if(size == 0){
            Log.d("ERROR", "No places found in Firestore");
            return;
        }
        // 初始化二维数组
        int[][] graph = new int[size][size];
        
        for(int i=0; i<size; i++){
            for(int j=0; j<size; j++){
                // 计算第i个与第j个地点的距离
                double distance = SphericalUtil.computeDistanceBetween(myList.get(i), myList.get(j));
                graph[i][j] = (int) distance;
            }
        }
        // 此处可对graph进行后续业务操作
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:45:59