O que é a palavra-chave "continue" e como funciona em Java?


302

Vi essa palavra-chave pela primeira vez e fiquei pensando se alguém poderia me explicar o que faz.

  • Qual é a continuepalavra - chave?
  • Como funciona?
  • Quando é usado?

Respostas:


416

Uma continueinstrução sem um rótulo será reexecutada da condição do mais interno whileou do doloop e da expressão de atualização do forloop mais interno . É frequentemente usado para finalizar antecipadamente o processamento de um loop e, assim, evitar ifinstruções profundamente aninhadas . No exemplo a seguir continue, obterá a próxima linha, sem processar a seguinte instrução no loop.

while (getNext(line)) {
  if (line.isEmpty() || line.isComment())
    continue;
  // More code here
}

Com um rótulo, continueserá reexecutado a partir do loop com o rótulo correspondente, em vez do loop mais interno. Isso pode ser usado para escapar de loops profundamente aninhados ou simplesmente para maior clareza.

Às vezes, continuetambém é usado como um espaço reservado para tornar um corpo de loop vazio mais claro.

for (count = 0; foo.moreData(); count++)
  continue;

A mesma declaração sem um rótulo também existe em C e C ++. O equivalente em Perl é next.

Esse tipo de fluxo de controle não é recomendado, mas se você escolher, também poderá usar continuepara simular uma forma limitada de goto. No exemplo a seguir, continueele executará novamente o for (;;)loop vazio .

aLoopName: for (;;) {
  // ...
  while (someCondition)
  // ...
    if (otherCondition)
      continue aLoopName;

513

continueé tipo como goto. Você está familiarizado break? É mais fácil pensar neles em contraste:

  • break finaliza o loop (salta para o código abaixo dele).

  • continue finaliza o restante do processamento do código dentro do loop para a iteração atual, mas continua o loop.


1
bom exemplo para break e continue, eu pensei que era mesmo antes> <.
yfsx

Impossível não torná-lo um bom 500 perfeito! +1
chapéu

100

Vamos ver um exemplo:

int sum = 0;
for(int i = 1; i <= 100 ; i++){
    if(i % 2 == 0)
         continue;
    sum += i;
}

Isso obteria a soma de apenas números ímpares de 1 a 100.


28

Se você pensa no corpo de um loop como uma sub-rotina, continueé mais ou menos como return. A mesma palavra-chave existe em C e serve ao mesmo objetivo. Aqui está um exemplo artificial:

for(int i=0; i < 10; ++i) {
  if (i % 2 == 0) {
    continue;
  }
  System.out.println(i);
}

Isso imprimirá apenas os números ímpares.


16

Geralmente, vejo continue(e break) como um aviso de que o código pode usar alguma refatoração, especialmente se o whileoufor declaração loop não estiver à vista imediatamente. O mesmo acontece returnno meio de um método, mas por um motivo um pouco diferente.

Como outros já disseram, continue passa para a próxima iteração do loop, enquanto breaksai do loop fechado.

Podem ser bombas de tempo de manutenção porque não há um vínculo imediato entre o continue/ breake o loop que continua / interrompe, exceto o contexto; adicione um loop interno ou mova as "tripas" do loop para um método separado e você terá um efeito oculto do continue/break falha.

IMHO, é melhor usá-los como uma medida de último recurso e garantir que seu uso seja agrupado firmemente no início ou no final do loop, para que o próximo desenvolvedor possa ver os "limites" do loop em uma tela .

continue, breakE return(que não seja o verdadeiro retorno no final do seu método), todos caem na categoria geral de "GOTOs escondidos". Eles colocam o controle de loop e função em locais inesperados, o que eventualmente causa bugs.


Estou interessado na razão pela qual o retorno é ruim. Já sinto que o retorno é ruim porque o Scala não incentiva o retorno .
Jus12

1
Por outro lado, permitir que um método retorne de um loop profundamente aninhado pode ser a maneira mais fácil, legível e razoável de fazer as coisas, em vez de criar variáveis ​​extras apenas para tornar a saída do loop mais limpa.
precisa

5

"continue" em Java significa ir para o final do loop atual, significa: se o compilador vê continuar em um loop, ele irá para a próxima iteração

Exemplo: este é um código para imprimir os números ímpares de 1 a 10

o compilador ignorará o código de impressão sempre que vir continuar na próxima iteração

for (int i = 0; i < 10; i++) { 
    if (i%2 == 0) continue;    
    System.out.println(i+"");
}


4

Como já mencionado continue, pulará o processamento do código abaixo e até o final do loop. Em seguida, você é movido para a condição do loop e executa a próxima iteração se essa condição ainda persistir (ou se houver um sinalizador, para a condição do loop indicado).

Deve-se destacar que, no caso de do - whilevocê ser movido para a condição na parte inferior após umcontinue , não no início do loop.

É por isso que muitas pessoas falham em responder corretamente o que o código a seguir irá gerar.

    Random r = new Random();
    Set<Integer> aSet= new HashSet<Integer>();
    int anInt;
    do {
        anInt = r.nextInt(10);
        if (anInt % 2 == 0)
            continue;
        System.out.println(anInt);
    } while (aSet.add(anInt));
    System.out.println(aSet);

* Se sua resposta for que aSetconterá números ímpares apenas 100% ... você está errado!


4

Continue é uma palavra - chave em Java e é usada para pular a iteração atual.

Suponha que você queira imprimir todos os números ímpares de 1 a 100

public class Main {

    public static void main(String args[]) {

    //Program to print all odd numbers from 1 to 100

        for(int i=1 ; i<=100 ; i++) {
            if(i % 2 == 0) {
                continue;
            }
            System.out.println(i);
        }

    }
}

A instrução continue no programa acima simplesmente ignora a iteração quando i é par e imprime o valor de i quando é ímpar.

A instrução Continue simplesmente tira você do loop sem executar as instruções restantes dentro do loop e dispara a próxima iteração.


3

Considere uma condição If Else. Uma instrução continue executa o que existe em uma condição e sai da condição, ou seja, passa para a próxima iteração ou condição. Mas uma pausa sai do circuito. Considere o seguinte programa. "

public class ContinueBreak {
    public static void main(String[] args) {
        String[] table={"aa","bb","cc","dd"};
        for(String ss:table){
            if("bb".equals(ss)){
                continue;
            }
            System.out.println(ss);
            if("cc".equals(ss)){
                break;
            }
        }
        System.out.println("Out of the loop.");
    }

}

Ele será impresso: aa cc Fora do loop.

Se você usar quebra no lugar de continuar (Depois de se.), Ela imprimirá aa e fora do loop .

Se a condição "bb" for igual a ss, for satisfeita: For Continue: Ir para a próxima iteração, ou seja, "cc" .equals (ss). For Break: sai do loop e imprime "Out of the loop".


2
Tenho certeza de que ele também imprimiria cc desde "cc"! = "Bb" e a instrução print é anterior aobreak
Ted Delezene

2

Estou um pouco atrasado para a festa, mas ...

Vale ressaltar que continueé útil para loops vazios, onde todo o trabalho é feito na expressão condicional que controla o loop. Por exemplo:

while ((buffer[i++] = readChar()) >= 0)
    continue;

Nesse caso, todo o trabalho de ler um caractere e anexá-lo bufferé feito na expressão que controla o whileloop. A continuedeclaração serve como um indicador visual de que o loop não precisa de um corpo.

É um pouco mais óbvio que o equivalente:

while (...)
{ }

e um estilo de codificação definitivamente melhor (e mais seguro) do que usar uma declaração vazia como:

while (...)
    ;

Definitivamente, concordo que seja um código mais limpo e legível, mas não tenho certeza de que sigo o seu argumento de que ele é "mais seguro" do que a outra opção, while (statement); delimitado diretamente usando um ponto e vírgula.
precisa

@Aalok - É mais seguro porque é fácil perder um ponto e vírgula solitário. Também é fácil deixar de fora acidentalmente, o que tornaria a próxima declaração a seguir whileao corpo da whilecláusula e que não seria visualmente óbvio. Um explícito continueé óbvio e transmite uma intenção que uma declaração vazia não.
precisa

Entendo, então você quer dizer principalmente da perspectiva do design. Isso faz sentido. Eu tinha algo subjacente à maneira como o loop é estruturado em mente.
quer


0

continue deve estar dentro de um loop Caso contrário, ele mostraO erro abaixo:

Continue fora do loop


0

A instrução continue é usada na estrutura de controle de loop quando você precisa pular para a próxima iteração do loop imediatamente.

Pode ser usado com loop for ou while. A instrução continue do Java é usada para continuar o loop. Ele continua o fluxo atual do programa e ignora o código restante na condição especificada.

No caso de um loop interno, ele continua apenas o loop interno.

Podemos usar a instrução Java continue em todos os tipos de loops, como loop for, while loop e do-while.

por exemplo

class Example{
    public static void main(String args[]){
        System.out.println("Start");
        for(int i=0; i<10; i++){
            if(i==5){continue;}
            System.out.println("i : "+i);   
        }
        System.out.println("End.");
    }
}

resultado:

Start
i : 0
i : 1
i : 2
i : 3
i : 4
i : 6
i : 7
i : 8
i : 9
End.

[número 5 é pular]

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.