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

Android Studio中Java调用PokeApi二次JSON读取异常求助

排查思路

1. 先抓全异常细节

  • 给HttpHandler.java第37行的代码套上显式try-catch,打印完整异常栈,别依赖全局捕获:
try {
    // 第37行及周边读取JSON的逻辑
} catch (Exception e) {
    Log.e("HttpHandler", "JSON读取失败", e);
    throw e; // 要抛就先打日志
}
  • 排查流重复读取问题:BufferedInputStream读完后指针会停在流末尾,第二次读取如果没重置流或重新获取输入流,直接读会触发EOF异常。确保每次请求都重新创建HttpURLConnection和对应输入流,别复用同一个流对象。

2. 再查资源释放是否彻底

  • 按「BufferedInputStream → InputStream → HttpURLConnection」的顺序关闭资源,每个步骤单独加try-catch,避免某一步失败导致后续资源没释放:
if (bufferedStream != null) {
    try {
        bufferedStream.close();
    } catch (IOException e) {
        Log.e("HttpHandler", "关闭BufferedStream失败", e);
    }
}
if (inputStream != null) {
    try {
        inputStream.close();
    } catch (IOException e) {
        Log.e("HttpHandler", "关闭InputStream失败", e);
    }
}
if (connection != null) {
    connection.disconnect();
}
  • 检查AsyncTask是否复用:如果AsyncTask实例被重复使用,可能残留旧的连接/流引用。确保每次请求都新建AsyncTask实例,或者在onPostExecute里清空所有资源引用。

3. 验证请求合法性

  • 打印第二次请求的URL,直接在浏览器访问确认返回是否为有效JSON:ListView传参时可能出现URL拼接错误(比如重复拼接、ID错误),导致接口返回非JSON内容引发读取异常。
  • 先检查响应状态码:获取输入流前先判断connection.getResponseCode(),如果是4xx/5xx错误,要读取错误流而非正常输入流,避免错误响应导致解析失败:
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
    inputStream = connection.getInputStream();
} else {
    inputStream = connection.getErrorStream();
    // 处理错误响应逻辑
}

4. 换读取方式做对比测试

  • 临时用BufferedReader替代BufferedInputStream读取,看是否还会报错:
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
    response.append(line);
}
reader.close();
  • 尝试用OkHttp/Retrofit替代原生HttpURLConnection:原生API的资源管理容易踩坑,成熟网络库会自动处理连接池、资源释放,能快速排查是否是原生API使用不当的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:47:08