Sonarqube java插件3.8-S2583误报

Sonarqube java插件3.8-S2583误报,sonarqube,Sonarqube,我想我们发现了一个假阳性: private static void copy(File from, File to) throws FileNotFoundException, IOException { FileChannel src = null; FileChannel dst = null; try { src = new FileInputStream(from).getChannel(); dst = new FileOutpu

我想我们发现了一个假阳性:

private static void copy(File from, File to) throws FileNotFoundException, IOException {
    FileChannel src = null;
    FileChannel dst = null;
    try {
        src = new FileInputStream(from).getChannel();
        dst = new FileOutputStream(to).getChannel();
        dst.transferFrom(src, 0, src.size());
    } finally {
        if (src != null) {
更改此条件,使其不总是计算为“true”

还是我错过了什么? 另一个例子:

        if (lastUpdate == null|| lastUpdate != null && lastUpdate.before(new Date(System.currentTimeMillis() - 900000)))

你实际上是在问两种不同的情况:

  • 您遇到了一个已知的限制,我们计划在下一版本的java插件中修复这个(硬)限制

  • 这一个事实上根本不是假阳性!:)如果变量
    lastUpdate
    为空,则该条件为真,而不计算
    |
    的右侧;如果为假,则为
    lastUpdate!=null将始终计算为true,因此您可以实际删除它


  • @1:你与这个问题的链接?是否要链接到jira问题?@2&&的优先级应高于| |。据我所知,它的计算方式应该是(lastUpdate==null | | |(lastUpdate!=null&&lastUpdate.before(new Date(System.currentTimeMillis()-900000))),这是正确的写入方式。@1修复链接。。。很抱歉,我可能在复制粘贴时还很困…:)@2您所说的是正确的,但是只有当第一个操作数为false(| |是短路运算符)时才会计算第二个操作数。您可以使用以下示例进行检查:
    boolean foo(int i){System.out.println(i);返回i%2==0;}if(foo(0)| foo(2)&&foo(4)){System.out.println(“plop”)}
    它只会打印
    0 plop
    啊,好的,我明白了,对不起,我看错了东西。。因此,应该将其重写为(lastUpdate==null | | lastUpdate.before(newdate(System.currentTimeMillis()-900000))完全相同。这是我们在编写规则时没有考虑的情况。让它标记这样一个好问题真的很酷。如果有帮助,请投票并接受asnwer。