FindBugs:解决“Method忽略InputStream.skip()的结果”的最佳方法是什么?

时间:2016-03-10 10:37:32

标签: java findbugs

我有以下代码:

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)

解决此问题的最佳方法是什么?

由于

2 个答案:

答案 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;