如何解决for循环中的SonarQube投诉?

时间:2016-03-01 09:54:21

标签: java for-loop sonarqube

我写了一个方法将字节从InputStream复制到OutputStream

// copies bytes from given input stream to specified output stream
// returns the number of bytes copied.
private static long copy(final InputStream input,
                         final OutputStream output)
        throws IOException {
    long count = 0L;
    final byte[] buffer = new byte[4096];
    for (int length; (length = input.read(buffer)) != -1; count += length) {
        output.write(buffer, 0, length);
    }
    return count;
}

SonarQube抱怨道。

  

此循环的停止条件测试"长度,输入,缓冲区"但是增量器会更新"计算"。

     

当for循环的停止条件和增量器不对同一个变量起作用时,几乎总是出错。即使它不是,也可能会混淆代码的未来维护者,应该避免使用。

是否有更好的代码用于同一目的?

更新

正如建议的答案,我确实喜欢这个,问题已经消失。

// copies bytes from given input stream to specified output stream
// returns the number of bytes copied.
private static long copy(final InputStream input,
                         final OutputStream output)
        throws IOException {
    long count = 0L;
    final byte[] buffer = new byte[4096];
    for (int length; (length = input.read(buffer)) != -1;) {
        output.write(buffer, 0, length);
        count += length;
    }
    return count;
}

2 个答案:

答案 0 :(得分:4)

你正在滥用for循环,这就是SonarQube发出警告的原因。在以下循环中,您在更新子句中递增count但停止条件不依赖于count

for (int length; (length = input.read(buffer)) != -1; count += length) {
                 ^---------------------------------^  ^-------------^
                      does not depend on count        increments count

相反,您应该使用while循环并增加循环体​​内的计数:

private static long copy(final InputStream input, final OutputStream output) throws IOException {
    long count = 0;
    final byte[] buffer = new byte[4096];
    int length;
    while ((length = input.read(buffer)) != -1) {
        output.write(buffer, 0, length);
        count += length;
    }
    return count;
}

答案 1 :(得分:1)

count += length放在for循环体中。它不是增量器,因此不属于那里,它只是计算副本大小。