Tengo el siguiente fragmento de código, donde la herramienta sonarlint dice que mi variable booleana sentinel siempre se evalúa como verdadera, y sentinel = true es una afirmación inútil.
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; } } } }¿Cuál podría ser el problema con el análisis de sonarlint? El código se compila perfectamente y se ejecuta según lo previsto.
Saludos.
Actualizar:
@kkk ha proporcionado dos valiosas respuestas. Vea abajo, pero dejo aquí el que más me gustó:
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; } } } }hacer centinela estático o usuario AtomicBoolean, es un problema de visibilidad
El cambio realizado por sentinel = true; nunca es visto por while (!sentinel) . Eso es debido a la instrucción break.
Dicho esto, su código es mucho más simple con un bucle for . Tu while simplemente lo hace complejo.
for(int counter = 0; counter < array.length; counter++) { out.println("Counter: " + counter); out.println("Array index: " + array[counter]); if (counter == array.length - 1) { out.println("End of the array reached"); out.println("Breaking..."); } } O, mejor aún, haga el counter == array.length - 1 acciones después del ciclo
for(int counter = 0; counter < array.length; counter++) { out.println("Counter: " + counter); out.println("Array index: " + array[counter]); } out.println("End of the array reached"); out.println("Breaking...");