校园公交追踪功能异常:点击图标无数据及JSON索引越界报错
校园公交追踪功能JSON越界问题排查与修复方案
嘿,我看你在开发校园公交追踪功能时遇到了点击公交图标无内容、还抛出org.json.JSONException: Index 0 out of range [0..0)的问题,结合你用Java+Android Studio+Firebase的技术栈,这个问题大概率是JSON数组解析时访问了空数组的索引导致的,下面给你一步步拆解排查和修复思路:
问题根源分析
这个报错的核心意思是:你试图访问一个长度为0的数组的第0个元素,而数组里根本没有元素。结合你的场景,大概率是这两个环节出了问题:
- 从Firebase获取的公交位置数据里,对应存储位置的JSON数组是空的;
- 你在解析数据时没做边界判断,直接去取索引0的元素,导致解析失败,进而让点击图标展示距离/时长的逻辑无法执行。
具体修复步骤
1. 先确认Firebase返回的数据是否正常
先在代码里加日志,把从Firebase拿到的原始数据打印出来,看看是不是真的为空或者结构不符合预期:
// 假设你从Firebase获取到的是字符串格式的JSON String firebaseLocationData = ...; // 你的数据获取代码 Log.d("BusLocationDebug", "Firebase返回的原始数据: " + firebaseLocationData);
然后打开Android Studio的Logcat,搜索BusLocationDebug,查看返回的JSON结构:
- 如果数组确实是空的,那要先检查Firebase控制台里的公交位置节点,确认位置数据是否已经正确上传;
- 如果结构和你预期的不一样(比如不是数组而是单个对象),那就要调整解析逻辑。
2. 给JSON解析加边界判断
在你解析JSON数组的代码里,一定要先判断数组长度大于0,再去访问索引元素,示例代码如下:
try { JSONArray locationArray = new JSONArray(firebaseLocationData); // 先判断数组是否有内容 if (locationArray.length() > 0) { JSONObject locationObj = locationArray.getJSONObject(0); double lat = locationObj.getDouble("latitude"); double lng = locationObj.getDouble("longitude"); // 后续计算距离、预计时长的逻辑 } else { Log.e("BusLocationError", "当前公交暂无位置数据"); // 这里可以给用户提示,比如在InfoWindow里显示"暂无位置信息" } } catch (JSONException e) { e.printStackTrace(); Log.e("BusLocationError", "解析位置数据失败: " + e.getMessage()); }
3. 优化公交Marker的点击逻辑
结合你贴的Marker代码片段,建议给每个公交Marker绑定唯一标识(比如公交ID),这样点击时能精准获取对应公交的位置数据,避免混同:
// 添加Marker时绑定公交ID Marker driverMarker = mMap.addMarker(new MarkerOptions() .position(new LatLng(location.latitude, location.longitude)) .title("公交" + rid)); driverMarker.setTag(rid); // 把公交ID存到Marker的Tag里 // 点击Marker时取出Tag,查询对应公交的位置 mMap.setOnMarkerClickListener(marker -> { String busId = (String) marker.getTag(); // 根据busId去Firebase查询对应公交的位置数据,再解析展示 return false; });
这样能避免因为某一辆公交的位置数据为空,导致所有公交的点击逻辑都失效的问题。
内容的提问来源于stack exchange,提问作者fahminazirul20
相关产品推荐
相关产品推荐

