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

Android Maps Polyline无路线问题:如何避免传入null值?

嘿,这个问题我熟!当用Directions API获取路线时,确实会碰到找不到路线的情况,这时候直接传null给addPolyline肯定会出问题。咱们可以在两个关键环节做判断,完美避开这个坑,具体方案如下:

第一步:解析JSON前先检查API返回的状态码

Google Directions API的响应里自带status字段,用来标识请求是否成功。常见的失败状态有:

  • NOT_FOUND:起点或终点无法被识别
  • ZERO_RESULTS:两地之间没有可行的路线(比如跨洋无交通路线)
  • INVALID_REQUEST:请求参数有误(比如坐标格式不对)

所以你要先在parse方法里先检查这个状态码,只有当状态为"OK"时才继续解析,否则直接返回空列表,避免后续出现null:

class DirectionsJSONParser {
    /** Receives a JSONObject and returns a list of lists containing latitude and longitude */
    List<List<HashMap<String, String>>> parse(JSONObject jObject) {
        List<List<HashMap<String, String>>> routes = new ArrayList<>();
        JSONArray jRoutes;
        JSONArray jLegs;
        JSONArray jSteps;
        
        try {
            // 先拿状态码判断请求是否成功
            String status = jObject.getString("status");
            if (!"OK".equals(status)) {
                // 可以根据不同状态打日志,方便调试
                Log.e("DirectionsError", "路线获取失败:" + status);
                return routes; // 返回空列表,而非null
            }
            
            jRoutes = jObject.getJSONArray("routes");
            
            // 遍历所有路线(通常只有一条)
            for (int i = 0; i < jRoutes.length(); i++) {
                jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs");
                List<HashMap<String, String>> path = new ArrayList<>();
                
                // 遍历路段
                for (int j = 0; j < jLegs.length(); j++) {
                    jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps");
                    
                    // 遍历每个步骤的polyline
                    for (int k = 0; k < jSteps.length(); k++) {
                        String polyline = (String) ((JSONObject) ((JSONObject) jSteps.get(k)).get("polyline")).get("points");
                        List<LatLng> list = decodePoly(polyline);
                        
                        // 把解码后的坐标存入HashMap
                        for (int l = 0; l < list.size(); l++) {
                            HashMap<String, String> hm = new HashMap<>();
                            hm.put("lat", Double.toString(list.get(l).latitude));
                            hm.put("lng", Double.toString(list.get(l).longitude));
                            path.add(hm);
                        }
                    }
                    routes.add(path);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception e) {
            // 捕获其他异常,避免崩溃
            Log.e("ParseError", "解析路线时出错:" + e.getMessage());
        }
        return routes;
    }
    
    // 你的polyline解码方法(保持原有逻辑即可)
    private List<LatLng> decodePoly(String encoded) {
        // 原有的解码代码...
    }
}
第二步:调用addPolyline前先验证结果有效性

当你调用parse方法拿到结果后,不要直接传给addPolyline,先判断返回的列表是否为空或者有效:

// 假设你已经拿到了API返回的JSONObject
DirectionsJSONParser parser = new DirectionsJSONParser();
List<List<HashMap<String, String>>> routes = parser.parse(jsonObject);

// 检查路线是否存在
if (routes != null && !routes.isEmpty()) {
    // 把HashMap列表转换成LatLng列表
    List<LatLng> polylinePoints = new ArrayList<>();
    for (List<HashMap<String, String>> path : routes) {
        for (HashMap<String, String> point : path) {
            double lat = Double.parseDouble(point.get("lat"));
            double lng = Double.parseDouble(point.get("lng"));
            polylinePoints.add(new LatLng(lat, lng));
        }
    }
    // 创建Polyline并添加到地图
    PolylineOptions polylineOpts = new PolylineOptions()
            .addAll(polylinePoints)
            .width(6)
            .color(Color.parseColor("#FF4081"));
    mMap.addPolyline(polylineOpts);
} else {
    // 没有找到路线,给用户友好提示
    Toast.makeText(getApplicationContext(), "无法找到两地之间的可行路线", Toast.LENGTH_SHORT).show();
}
额外优化小技巧
  • 精准提示用户:根据不同的status码给用户不同的提示,比如NOT_FOUND时提示“无法识别您输入的地点”,ZERO_RESULTS时提示“两地之间没有可通行的路线”。
  • 提前校验请求参数:在发起API请求前,先检查起点和终点的坐标是否合法(比如纬度在±90之间,经度在±180之间),减少无效请求。
  • 处理空指针:即使做了前面的判断,也尽量给addPolyline传入非null的PolylineOptions,避免潜在的NullPointerException。

这样处理之后,就再也不会出现给addPolyline传null的情况了,同时还能提升用户体验~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:58:41