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

