【问题标题】:Eclipse SonarLint false positive "Unused assignments should be removed (java:S1854)"Eclipse SonarLint 误报“应删除未使用的分配 (java:S1854)”
【发布时间】:2020-05-13 10:56:13
【问题描述】:

我正在使用 Eclipse 2020-03 (4.15.0) 和 Sonarlint for Eclipse 5.1.0.17086,我在以下代码中收到了 IMO 误报 S1854 警告(摘自“Java 8 In Action”一书)。使用 Java OpenJDK 13.0.2。这不是什么大事,因为我只是在学习 Java 8 技术。我只是想了解为什么这些行被标记...

package nl.paul.forkjoin;

import java.util.concurrent.RecursiveTask;

public class ForkJoinSumCalculator extends RecursiveTask<Long> {
private static final long serialVersionUID = 1L;

private final long[] numbers;
private final int start;
private final int end;

public static final long THRESHOLD = 10_000;

public ForkJoinSumCalculator(long[] numbers) {
    this(numbers, 0, numbers.length);
}

private ForkJoinSumCalculator(long[] numbers, int start, int end) {
    this.numbers = numbers;
    this.start = start;
    this.end = end;
}

@Override
protected Long compute() {
    int length = end - start; //SonarLint S1854 warning
    if (length <= THRESHOLD) {
        return computeSequentially();
    }
    ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length / 2); //SonarLint S1854 warning
    ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length / 2, end); //SonarLint S1854 warning
    leftTask.fork();
    return leftTask.join() + rightTask.compute();
}

private long computeSequentially() {
    long sum = 0;
    for (int i = start; i < end; i++) {
        sum += numbers[i];
    }
    return sum;
}
}

我在这里错过了什么吗? “length”、“leftTask”和“rightTask”都在代码中多次使用...

上面的类是用下面的类测试的:

package nl.paul.forkjoin;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;

public class ForkJoinTest {

    public static void main(String[] args) {
        System.out.println(new ForkJoinTest().doIt(10_000_000));
    }

    private long doIt(long n) {
        long[] numbers = LongStream.rangeClosed(0, n).toArray();
        long start = System.currentTimeMillis();
        ForkJoinTask<Long> task = new ForkJoinSumCalculator(numbers);
        long result = new ForkJoinPool().invoke(task);
        long finish = System.currentTimeMillis();
        System.out.println("Processing took " + (finish - start) + " msec.");
        return result;
    }
}

【问题讨论】:

标签: java eclipse sonarlint-eclipse


【解决方案1】:

我对 Sonar 上的警告 S1854 进行了简短调查,并在 Github 和 Sonar 网站本身上看到了几个问题,显然它已在 2020 年 2 月修复。检查您的声纳是否是最新的,如果是,则错误可能尚未修复:(

https://jira.sonarsource.com/browse/SONARJAVA-3281

【讨论】:

  • 感谢您的调查。我在 Eclipse 中检查了 SonarLint 更新。没有。我也检查了你的链接。它处理 lambda 代码中的误报,而我的代码不是这种情况。我们会看到...
【解决方案2】:

我终于解决了这个问题,我在 sonarlint 论坛 (https://community.sonarsource.com/t/java-s2166-rule-not-working/22943/15) 上的帖子让我走上了正轨。 我的项目使用 Java 13,而我的 Windows cmd“Java -version”返回 Java 1.8 作为正在运行的 Java 版本。这种不匹配(Eclipse 使用 Java 1.8 启动,而项目使用 Java 13)导致了 SonarLint FP。

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2015-11-11
    • 2020-07-10
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多