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

Java通过GET请求按日期过滤JSON接口数据时空指针异常解决

问题根因

  • 核心问题是GET请求参数未做URL编码:Python的requests库传入params参数时会自动对特殊字符做URL转义,而你直接把JSONObject拼接到URL中,JSON里的引号、空格、冒号都是URL特殊字符,未转义会导致服务端无法正确解析filter参数,返回的响应结构不符合预期,后续解析响应时就会触发空指针。
  • 次要问题是代码缺少异常判断:没有判断HTTP响应状态码、没有判断响应JSON中是否存在对应字段,遇到异常响应时直接解析很容易触发NPE。

修改后的代码示例

private JSONObject getFormData() throws Exception {
    // 构造过滤参数
    JSONObject filterJson = new JSONObject();
    filterJson.put("created_at:gt", yesterday); // 确保yesterday已正确赋值,格式为yyyy-mm-dd 00:00:00
    filterJson.put("status", "ACTIVE");
    
    // 关键:对filter参数做URL编码
    String encodedFilter = URLEncoder.encode(filterJson.toString(), StandardCharsets.UTF_8.name());
    String queryParams = "?filter=" + encodedFilter + "&limit=1000"; // 原Python代码有limit参数,你之前漏了
    
    URL url = new URL("https://thirdparty.com/submissions" + queryParams);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestProperty("APIKEY", apikey);
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(10000);
    
    // 先判断响应状态码,2xx才正常处理
    int responseCode = conn.getResponseCode();
    if (responseCode < 200 || responseCode >= 300) {
        // 打印错误响应方便排查
        BufferedReader errBr = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        StringBuilder errSb = new StringBuilder();
        String errLine;
        while ((errLine = errBr.readLine()) != null) {
            errSb.append(errLine);
        }
        errBr.close();
        throw new RuntimeException("请求失败,状态码:" + responseCode + ",错误信息:" + errSb);
    }
    
    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = br.readLine()) != null) {
        sb.append(line);
    }
    br.close();
    conn.disconnect();
    
    return new JSONObject(sb.toString());
}

后续使用注意事项

  • 拿到返回的JSONObject后,先判断是否存在content字段再取值:
JSONObject res = getFormData();
if (res.has("content") && !res.isNull("content")) {
    JSONArray contentArr = res.getJSONArray("content");
    // 遍历数组时也要判空字段
    for (int i = 0; i < contentArr.length(); i++) {
        JSONObject item = contentArr.getJSONObject(i);
        if (!item.isNull("created_at")) {
            String createdAt = item.getString("created_at");
            // 后续业务逻辑
        }
    }
}
  • 如果还有空指针问题,打印完整的异常栈信息,定位具体是哪一行代码触发的NPE,针对性排查变量是否为null即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:57:08