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

