【发布时间】:2022-01-23 11:32:29
【问题描述】:
我有下一个代码 sn-p,其中 sonarlint 工具说我的布尔变量 sentinel 总是评估为真,而 sentinel = true 这是一个无用的声明。
import static java.lang.System.*;
public class Sentinel {
private static final int[] array = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
public static void main(String[] args) {
boolean sentinel = false;
int counter = 0;
while (!sentinel) {
out.println( "Counter: " + counter);
out.println( "Array index: " + array[counter] );
counter++;
if ( counter == array.length - 1 ) {
out.println( "End of the array reached" );
sentinel = true;
out.println( "Breaking..." );
break;
}
}
}
}
sonarlint analisys 可能有什么问题?代码完美编译并按预期运行。
问候。
更新:
@kkk 提供了两个有价值的答案。见下文,但我把我更喜欢的放在这里:
import java.util.concurrent.atomic.AtomicBoolean;
import static java.lang.System.*;
public class Sentinel {
private static final int[] array = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
public static void main(String[] args) {
AtomicBoolean sentinel = new AtomicBoolean(false);
int counter = 0;
while ( !sentinel.get() ) {
out.println( "Counter: " + counter);
out.println( "Array index: " + array[counter] );
counter++;
if ( counter == array.length - 1 ) {
out.println( "Counter limit reached" );
sentinel.set( true );
out.println( "Breaking..." );
break;
}
}
}
}
【问题讨论】:
-
由于 break 语句导致循环退出,
sentinel在被读取之前就超出了范围。 -
那么
sentinel没有超出范围的时间呢?因为循环中断条件不正确?在我看来,这似乎是分析系统的一个很大的任意条件,并不反映现实 -
sentinel是不必要的。拥有它并不会改变您的代码的功能。
标签: java while-loop boolean sonarlint sonarlint-intellij