我有以下代码:
final Response res = this.origin.act(req);
for (int count = req.body().available(); count > 0;
count = req.body().available()) {
body().skip(count);
}
return res;
FindBugs在 body()中报告此问题.skip(count) :
FindBugs: L B RR: ignores result of java.io.InputStream.skip(long)
解决此问题的最佳方法是什么?
由于
答案 0 :(得分:2)
此方法忽略java.io.InputStream.skip()的返回值,该值可以跳过多个字节。如果未检查返回值,则调用者将无法正确处理跳过的字节数少于调用者请求的字节数。这是一种特别隐蔽的错误,因为在许多程序中,从输入流中跳过通常会跳过所请求的全部数据,导致程序偶尔失败。但是,对于Buffered流,skip()只会跳过缓冲区中的数据,并且通常无法跳过请求的字节数。
为避免findbugs警告,因此忽略返回值的错误可能会掩盖,您需要检查返回值是否与您请求跳过的数字相匹配;例如
final Response res = this.origin.act(req);
for (int count = req.body().available(); count > 0;
count = req.body().available()) {
long skippedBytes = body().skip(count);
if (skippedBytes != count) {
// do something
}
}
return res;
如果它们不匹配,你应该做的'某事'是你需要依赖于它所使用的情况的选择;你可能想要抛出异常,你可能想要记录并继续,或者你可能想要执行某种后备等等
答案 1 :(得分:0)
@beresfordt谢谢。我想我使用ByteStreams.skipFully(req.body(), count);
找到了更好的解决方案final Response res = this.origin.act(req);
for (int count = req.body().available(); count > 0;
count = req.body().available()) {
ByteStreams.skipFully(req.body(), count);
}
return res;