java - Eclipse SonarLint 误报“应删除未使用的分配 (java:S1854)”
问题描述
我正在使用 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;
}
}
解决方案
我终于解决了这个问题,我在 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。
推荐阅读
- hadoop - Hadoop 3.2.1 ErasureCoding ISA-L 问题?
- regex - 部分网址的正则表达式
- javascript - Windows 正常,所以 RO 会运行
- ruby-on-rails - 如何加快简单的 Rails 数据库查询?
- javascript - 如何从创建的函数中获取创建函数的函数的参数
- javascript - 通过使用 javascript 追加插入的复选框不会发布数据
- javascript - 如何更改 jquery 事件的顺序?
- javascript - ThingsBoard:如何将我的自定义小部件添加到与现有内置小部件相同的仪表板上,而不会导致错误?
- python - MADDPG 操作打印特定值
- javascript - 尝试在本机反应中推送元素时,推送不是功能