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
相关产品推荐
相关产品推荐

