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

Geocode API HTTP响应返回null问题排查求助

分析你的Geocode API返回null问题

先看你代码里最明显的错误——URL参数拼接错误!你构造URL的时候用了两个问号:

String url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "?key=" + key;

URL里第一个参数用?,后续所有参数都应该用&连接,所以这里的第二个?要改成&,否则API会把?key=xxx当成地址的一部分,根本识别不到你的API密钥,这大概率是导致返回null的主要原因!

除了这个问题,还有几个常见的坑需要你排查:

  • 必须检查API返回的status字段
    Geocode API的响应里一定会有status字段,只有当它的值是OK时,results数组才会有数据。如果是ZERO_RESULTS(地址无法匹配)、REQUEST_DENIED(密钥无效/权限不足)、OVER_QUERY_LIMIT(请求超限)这些状态,results要么是空数组要么是null,你直接去取getJSONObject(0)肯定会出问题。

  • 不要手动替换空格,用标准URL编码
    你手动把空格换成%是不对的,正确的做法是用URLEncoder.encode(address, "UTF-8")来编码整个地址字符串,这样能处理所有特殊字符(比如逗号、括号、#等),避免地址格式错误导致API无法解析。

  • 确认API密钥的配置
    检查你的密钥是否已经在Google Cloud控制台启用了Geocoding API,同时确认没有设置IP限制或者API调用配额不足,这些都会导致请求被拒绝,返回无结果。

  • 增加空值判断,避免崩溃
    即使status是OK,也有可能results数组为空(虽然这种情况很少),所以在取第一个元素之前,要先判断数组长度是否大于0。

这里给你修正后的代码示例,把这些问题都处理了:

public CheckLocation(String address) {
    try {
        String key = "insert key";
        // 用标准URL编码处理地址
        String encodedAddress = URLEncoder.encode(address, "UTF-8");
        // 修正URL参数拼接,用&连接key参数
        String url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + encodedAddress + "&key=" + key;
        
        URL urlObj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");
        
        int responseCode = con.getResponseCode();
        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);
        
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        
        JSONObject myResponse = new JSONObject(response.toString());
        // 先检查status是否为OK
        String status = myResponse.getString("status");
        if ("OK".equals(status)) {
            JSONArray results = myResponse.getJSONArray("results");
            // 确保results数组不为空
            if (results.length() > 0) {
                JSONObject firstResult = results.getJSONObject(0);
                JSONObject location = firstResult.getJSONObject("geometry").getJSONObject("location");
                
                double latitude = location.getDouble("lat");
                double longitude = location.getDouble("lng");
                formattedAddress = firstResult.getString("formatted_address");
                coordinates = latitude + "," + longitude;
            } else {
                System.out.println("No results found for the address");
            }
        } else {
            System.out.println("API request failed with status: " + status);
            // 可以根据不同status做不同处理,比如超限了提示用户,密钥错误提示配置问题等
        }
        
    } catch (Exception e) {
        e.printStackTrace();
    }
}

先把URL的问题改了,然后加上status检查和空数组判断,应该就能解决大部分返回null的情况了。如果还是有问题,看控制台输出的status是什么,就能定位具体原因了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:07:44