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

使用OkHttp3获取errorBody时如何解决try-with-resources警告?

OkHttp3 正确获取 errorBody 的方法

当你直接通过ResponseBody errorBody = response.errorBody();获取错误响应体时,Android Studio弹出'ResponseBody' used without 'try'-with-resources statement警告,本质是因为ResponseBody是持有IO资源的对象,若不妥善关闭会引发资源泄漏,必须用try-with-resources语法来自动管理资源。

正确实现方式

1. 直接读取错误内容(单次读取)

如果只需要读取一次错误内容,直接用try-with-resources包裹errorBody,它会自动在代码块结束后关闭资源:

if (!response.isSuccessful()) {
    // 用try-with-resources自动管理errorBody的生命周期
    try (ResponseBody errorBody = response.errorBody()) {
        if (errorBody != null) {
            String errorText = errorBody.string();
            // 在这里处理错误文本,比如打印、解析等
            Log.e("Error", errorText);
        }
    } catch (IOException e) {
        // 处理IO异常
        e.printStackTrace();
    }
}

2. 多次复用错误内容

因为errorBody.string()或errorBody.bytes()会消耗并关闭流,无法重复调用。如果需要多次使用错误内容,建议先将内容缓存为字节数组:

if (!response.isSuccessful()) {
    try (ResponseBody errorBody = response.errorBody()) {
        if (errorBody != null) {
            byte[] errorBytes = errorBody.bytes();
            // 基于字节数组可以多次转换为字符串
            String errorContent1 = new String(errorBytes);
            String errorContent2 = new String(errorBytes);
            // 复用错误内容做后续处理
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关键注意事项

  • 必须对errorBody做非空判断:当HTTP响应没有错误体时,response.errorBody()会返回null
  • 不要手动调用errorBody.close():try-with-resources会自动完成关闭操作,手动调用可能引发异常
  • string()和bytes()方法只能调用一次:调用后流会被关闭,再次调用会抛出IO异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:33:15