A declaração do break
Como você viu ao trabalhar com instruções switch, uma instrução break transfere o fluxo de controle para a declaração anexa. O mesmo vale para declarações de break que aparecem dentro do while , do-while e for loops, terminando o loop mais cedo, como mostrado na Figura 2.9
Observe na Figura 2.9 que a instrução break pode ter um parâmetro de etiqueta opcional.
Sem um parâmetro label, a instrução break terminará o loop interno mais próximo atualmente no processo de execução. O parâmetro de etiqueta opcional nos permite sair de um loop externo de nível superior. No exemplo a seguir, procuramos pela primeira matriz (x , y) posição de índice de um número dentro de uma matriz bidimensional não classificada:
public class SearchSample {
public static void main(String[] args) {
int[][] list = {{1,13,5},{1,2,5},{2,7,2}};
int searchValue = 2;
int positionX = -1;
int positionY = -1;
PARENT_LOOP: for(int i=0; i<list.length; i++) {
for(int j=0; j<list[i].length; j++) {
if(list[i][j]==searchValue) {
positionX = i;
positionY = j;
break PARENT_LOOP;
}
}
}
if(positionX==-1 || positionY==-1) {
System.out.println("Value "+searchValue+" not found");
} else {
System.out.println("Value "+searchValue+" found at: " +
"("+positionX+","+positionY+")");
}
}
}
Quando executado, este código irá gerar:
Value 2 found at: (1,1)
Em particular, dê uma olhada na quebra de declaração PARENT_LOOP . Esta afirmação vai quebrar toda a estrutura de loop, assim que o primeiro valor correspondente for encontrado. Agora imagine o que aconteceria se substituíssemos o corpo do laço interno pelo seguinte:
if(list[i][j]==searchValue) {
positionX = i;
positionY = j;
break;
}
Como isso mudaria nosso fluxo e a saída? Em vez de sair quando o primeiro valor correspondente for encontrado, o programa agora só sairá do loop interno quando a condição é satisfeita. Em outras palavras, a estrutura agora encontrará o primeiro valor correspondente do último loop interno que contém o valor, resultando na seguinte saída:
Value 2 found at: (2,0)
Finalmente, e se removêssemos o intervalo completamente?
if(list[i][j]==searchValue) {
positionX = i;
positionY = j;
}
Neste caso, o código irá procurar o último valor em toda a estrutura que tem o valor de correspondência. A saída ficará assim:
Value 2 found at: (2,2)
Você pode ver neste exemplo que usar um rótulo em uma instrução break em um loop aninhado, ou não usar a instrução break, pode fazer com que a estrutura do loop se comporte diferente.