Visão geral dos laços de repetição
Laços (loops) permitem repetir um bloco de código enquanto uma condição for verdadeira ou enquanto houver itens a processar. Em Java, os principais são for, while, do-while e o for-each (forma aprimorada do for para percorrer arrays e coleções).
Quando usar cada laço
- for: quando você sabe (ou consegue calcular) quantas iterações serão necessárias, ou quando precisa de um índice.
- while: quando a repetição depende de uma condição que pode mudar de forma não trivial e você não sabe previamente quantas vezes vai repetir.
- do-while: quando o bloco precisa executar ao menos uma vez antes de testar a condição.
- for-each: quando você quer percorrer todos os elementos de um array/coleção de forma simples, sem precisar de índice.
Laço for: contagem e acesso por índice
O for tradicional tem três partes: inicialização, condição e atualização. Ele é ideal para contagens, percorrer arrays por índice e cenários em que você precisa saber a posição do elemento.
for (int i = 0; i < 5; i++) { System.out.println(i);}Passo a passo (como pensar um for)
- 1) Defina o contador: normalmente começa em 0 (
int i = 0). - 2) Defina a condição de parada: por exemplo, enquanto
i < tamanho. - 3) Defina como o contador muda: geralmente
i++(incrementa 1).
Exemplo prático: somar valores de um array
int[] valores = {10, 20, 30, 40};int soma = 0;for (int i = 0; i < valores.length; i++) { soma += valores[i];}System.out.println("Soma = " + soma);Exemplo prático: gerar relatório simples no console (índice + valor)
int[] notas = {7, 10, 5, 8};for (int i = 0; i < notas.length; i++) { System.out.println("Aluno #" + (i + 1) + " - nota: " + notas[i]);}Laço while: repetir enquanto a condição for verdadeira
O while testa a condição antes de executar o bloco. É útil quando a repetição depende de um estado que vai mudando (por exemplo, ler dados até que uma condição seja atingida).
int tentativas = 0;while (tentativas < 3) { System.out.println("Tentativa: " + tentativas); tentativas++;}Passo a passo (evitando erros comuns)
- 1) Garanta que a condição pode se tornar falsa em algum momento.
- 2) Atualize o estado dentro do laço (ex.: incrementar contador, consumir próximo item, etc.).
- 3) Se houver múltiplos caminhos (if/else), garanta que todos atualizam o estado quando necessário.
Exemplo prático: encontrar o primeiro número maior que 100
int[] dados = {10, 55, 80, 120, 130};int i = 0;while (i < dados.length && dados[i] <= 100) { i++;}if (i < dados.length) { System.out.println("Primeiro > 100: " + dados[i] + " (índice " + i + ")");} else { System.out.println("Nenhum valor > 100 encontrado");}Laço do-while: executar ao menos uma vez
No do-while, o bloco executa primeiro e a condição é verificada ao final. Use quando você precisa executar uma ação e só depois decidir se repete.
int numero = 0;do { System.out.println("Executa pelo menos uma vez. numero=" + numero); numero++;} while (numero < 1);Cenário típico
- Menus no console (mostrar opções, ler escolha, repetir até escolher “sair”).
- Repetir uma operação até que a entrada seja válida (quando a validação ocorre após uma tentativa).
Controlando iterações com break e continue
break: interrompe o laço
Use break para sair imediatamente do laço quando você já encontrou o que precisava ou quando uma condição de parada “extra” acontece.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
int[] nums = {3, 7, 2, 9, 5};int alvo = 9;int posicao = -1;for (int i = 0; i < nums.length; i++) { if (nums[i] == alvo) { posicao = i; break; }}System.out.println("Posição do alvo: " + posicao);continue: pula para a próxima iteração
Use continue quando você quer ignorar o restante do bloco para certos casos, mas continuar iterando.
int[] nums = {10, -5, 0, 7, -2};int somaPositivos = 0;for (int n : nums) { if (n <= 0) { continue; } somaPositivos += n;}System.out.println("Soma dos positivos = " + somaPositivos);Boas práticas com break/continue
- Prefira condições claras no início do laço (guard clauses) para reduzir aninhamento.
- Evite muitos
continueebreakno mesmo laço; pode dificultar a leitura. - Quando a lógica ficar complexa, considere extrair para um método.
Como evitar loops infinitos
Um loop infinito ocorre quando a condição de parada nunca é atingida. Isso pode travar o programa ou consumir recursos desnecessariamente.
Causas comuns
- Esquecer de atualizar o contador/estado (ex.: não fazer
i++). - Condição errada (ex.: usar
>quando deveria ser<). - Atualização no lugar errado (ex.: dentro de um
ifque nem sempre executa).
Exemplo de problema e correção
Problema (contador nunca muda):
int i = 0;while (i < 3) { System.out.println(i); // faltou i++;}Correção:
int i = 0;while (i < 3) { System.out.println(i); i++;}Dicas práticas de segurança
- Durante testes, use limites máximos quando fizer sentido (ex.: “no máximo 1000 iterações”).
- Logue/mostre variáveis de controle quando estiver depurando (contador, condição, tamanho da lista).
- Em loops que dependem de entrada externa, trate casos inesperados (valores nulos, listas vazias, etc.).
for-each: percorrendo arrays e coleções
O for-each simplifica a iteração quando você quer visitar cada elemento. Ele funciona com arrays e com coleções (como List).
Em arrays
int[] valores = {2, 4, 6};for (int v : valores) { System.out.println("Valor: " + v);}Em coleções (List)
java.util.List<String> nomes = java.util.Arrays.asList("Ana", "Bruno", "Carla");for (String nome : nomes) { System.out.println(nome);}Limitações do for-each
- Sem índice: você não tem diretamente a posição. Se precisar do índice, use
fortradicional ou controle um contador manual. - Remoção durante iteração: em coleções, remover elementos dentro do
for-eachgeralmente causaConcurrentModificationException. Para remover, use umIteratorou métodos específicos comoremoveIf(quando aplicável). - Substituição do elemento: em arrays, você pode alterar o array via índice; no
for-each, a variável do laço é uma cópia do valor (para primitivos) ou uma referência (para objetos), mas reatribuir a variável não troca o elemento no array/lista.
Exemplo: quando você precisa do índice
java.util.List<String> itens = java.util.Arrays.asList("A", "B", "C");for (int i = 0; i < itens.size(); i++) { System.out.println("#" + i + " = " + itens.get(i));}Exemplo: remoção correta durante iteração (Iterator)
java.util.List<Integer> numeros = new java.util.ArrayList<>();numeros.add(1);numeros.add(2);numeros.add(3);numeros.add(4);java.util.Iterator<Integer> it = numeros.iterator();while (it.hasNext()) { int n = it.next(); if (n % 2 == 0) { it.remove(); }}System.out.println(numeros);Exercícios práticos (processamento de listas, contagem, filtros e relatórios)
Nos exercícios abaixo, use apenas console (System.out.println) e estruturas de repetição. Se quiser, crie métodos auxiliares para organizar o código.
Exercício 1: estatísticas básicas de uma lista de números
Objetivo: dado um array de inteiros, imprimir: quantidade de elementos, soma, média (double), menor e maior valor.
Passo a passo sugerido:
- Crie variáveis:
soma,menor,maior. - Inicialize
menoremaiorcom o primeiro elemento. - Percorra o array com
for(oufor-each) acumulando soma e atualizando menor/maior. - Calcule a média como
(double) soma / quantidade. - Imprima um relatório no console.
int[] nums = {12, 5, 9, 20, 7};int soma = 0;int menor = nums[0];int maior = nums[0];for (int n : nums) { soma += n; if (n < menor) menor = n; if (n > maior) maior = n;}double media = (double) soma / nums.length;System.out.println("Qtd: " + nums.length);System.out.println("Soma: " + soma);System.out.println("Média: " + media);System.out.println("Menor: " + menor);System.out.println("Maior: " + maior);Exercício 2: contagem e filtro (pares, ímpares e positivos)
Objetivo: dado um array, contar quantos são pares, ímpares, positivos, negativos e zeros.
Regras:
- Use
continuepara pular rapidamente casos (por exemplo, quando for zero). - Imprima um relatório final com as contagens.
int[] nums = {0, -3, 2, 7, -8, 0, 10};int pares = 0, impares = 0, positivos = 0, negativos = 0, zeros = 0;for (int n : nums) { if (n == 0) { zeros++; continue; } if (n > 0) positivos++; else negativos++; if (n % 2 == 0) pares++; else impares++;}System.out.println("Pares: " + pares);System.out.println("Ímpares: " + impares);System.out.println("Positivos: " + positivos);System.out.println("Negativos: " + negativos);System.out.println("Zeros: " + zeros);Exercício 3: encontrar o primeiro valor que atende a uma condição (uso de break)
Objetivo: encontrar o primeiro número maior que um limite (ex.: 50). Se existir, imprimir o valor e o índice; senão, informar que não encontrou.
Passo a passo sugerido:
- Use
fortradicional para ter o índice. - Ao encontrar, salve o índice e use
break.
int[] nums = {10, 20, 55, 40, 80};int limite = 50;int idx = -1;for (int i = 0; i < nums.length; i++) { if (nums[i] > limite) { idx = i; break; }}if (idx != -1) { System.out.println("Encontrado: " + nums[idx] + " no índice " + idx);} else { System.out.println("Nenhum número > " + limite);}Exercício 4: gerar relatório de aprovação (lista de notas)
Objetivo: dado um array de notas (0 a 10), imprimir um relatório com: total de alunos, aprovados (nota >= 7), recuperação (nota >= 5 e < 7), reprovados (nota < 5) e a maior nota.
Desafio extra: imprimir também a lista de índices dos aprovados.
double[] notas = {7.5, 4.0, 6.5, 9.0, 5.0, 2.5};int aprovados = 0, recuperacao = 0, reprovados = 0;double maior = notas[0];for (int i = 0; i < notas.length; i++) { double n = notas[i]; if (n > maior) maior = n; if (n >= 7.0) { aprovados++; System.out.println("Aprovado: aluno #" + (i + 1) + " nota=" + n); } else if (n >= 5.0) { recuperacao++; } else { reprovados++; }}System.out.println("Total: " + notas.length);System.out.println("Aprovados: " + aprovados);System.out.println("Recuperação: " + recuperacao);System.out.println("Reprovados: " + reprovados);System.out.println("Maior nota: " + maior);Exercício 5: remoção de elementos com segurança em uma lista
Objetivo: dada uma List<Integer>, remover todos os números menores que 0 e imprimir a lista final.
Regras:
- Não remova usando
for-each. - Use
Iterator(ou, se preferir,removeIf).
java.util.List<Integer> nums = new java.util.ArrayList<>();nums.add(3);nums.add(-1);nums.add(0);nums.add(-5);nums.add(8);java.util.Iterator<Integer> it = nums.iterator();while (it.hasNext()) { int n = it.next(); if (n < 0) { it.remove(); }}System.out.println("Após remoção: " + nums);Resumo rápido de escolha do laço (tabela)
| Situação | Laço recomendado | Por quê |
|---|---|---|
| Precisa de índice/posição | for | Controle explícito do contador |
| Não sabe quantas repetições | while | Condição controla a repetição |
| Executar pelo menos uma vez | do-while | Condição é verificada no final |
| Percorrer todos os itens sem índice | for-each | Sintaxe simples e legível |
| Remover itens de uma lista durante iteração | Iterator + while | Remoção segura sem erro de modificação |