从REST接口获取JSON解析userPin时出现空指针异常,求排查
排查空指针异常的原因及修复方案
首先,咱们来拆解你代码里的核心问题——读取响应内容的方式完全错误,这直接引发了空指针异常。
关键错误点
你在while循环里调用br.toString()来获取JSON内容,但BufferedReader.toString()返回的根本不是接口返回的文本数据,而是这个BufferedReader对象的内存标识字符串(类似java.io.BufferedReader@xxxxxx)。用这种无效字符串创建JSONObject,要么会触发JSON解析异常,要么得到的JSONObject是无效状态,当你调用json.getInt("userPin")时自然就会抛出空指针异常。
另外,你的循环逻辑也有问题:明明已经把每行内容读到了line变量里,却完全没使用这个变量,反而去调用br.toString(),等于白读了接口响应。
修复后的代码
正确的做法是把读取到的所有行拼接成完整的JSON字符串,再进行解析:
if (con.getResponseCode() == HttpsURLConnection.HTTP_OK || con.getResponseCode() == HttpsURLConnection.HTTP_ACCEPTED ) { String line; StringBuilder responseBuilder = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); // 把所有响应行拼接成完整的JSON字符串 while ((line = br.readLine()) != null) { responseBuilder.append(line); } // 关闭流,避免资源泄漏 br.close(); // 用完整的JSON字符串创建解析对象 JSONObject json = new JSONObject(responseBuilder.toString()); userPinRetrieved = String.valueOf(json.getInt("userPin")); }
额外优化建议
- 记得添加异常捕获(比如
JSONException、IOException),避免未处理的异常导致程序崩溃; - 可以用try-with-resources语法自动关闭流,代码更安全简洁:
if (con.getResponseCode() == HttpsURLConnection.HTTP_OK || con.getResponseCode() == HttpsURLConnection.HTTP_ACCEPTED ) { try (BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()))) { StringBuilder responseBuilder = new StringBuilder(); String line; while ((line = br.readLine()) != null) { responseBuilder.append(line); } JSONObject json = new JSONObject(responseBuilder.toString()); userPinRetrieved = String.valueOf(json.getInt("userPin")); } catch (IOException | JSONException e) { e.printStackTrace(); // 这里可以添加异常处理逻辑,比如给userPinRetrieved设置默认值或提示用户 } }
这样修改后,就能正确读取并解析接口返回的JSON,顺利获取到userPin的值了。
内容的提问来源于stack exchange,提问作者AndroidBeginner2018
相关产品推荐
相关产品推荐

