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

