Java Essencial: Laços de repetição (for, while, do-while) e for-each

Capítulo 8

Tempo estimado de leitura: 9 minutos

+ Exercício

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.

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

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 continue e break no 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 if que 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 for tradicional ou controle um contador manual.
  • Remoção durante iteração: em coleções, remover elementos dentro do for-each geralmente causa ConcurrentModificationException. Para remover, use um Iterator ou métodos específicos como removeIf (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 menor e maior com o primeiro elemento.
  • Percorra o array com for (ou for-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 continue para 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 for tradicional 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çãoLaço recomendadoPor quê
Precisa de índice/posiçãoforControle explícito do contador
Não sabe quantas repetiçõeswhileCondição controla a repetição
Executar pelo menos uma vezdo-whileCondição é verificada no final
Percorrer todos os itens sem índicefor-eachSintaxe simples e legível
Remover itens de uma lista durante iteraçãoIterator + whileRemoção segura sem erro de modificação

Agora responda o exercício sobre o conteúdo:

Em qual situação o laço do-while é a melhor escolha em Java?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

No do-while, o bloco é executado primeiro e só depois a condição é verificada. Por isso, ele é indicado quando a ação precisa acontecer ao menos uma vez antes de decidir se repete.

Próximo capitúlo

Java Essencial: Métodos, parâmetros, retorno e sobrecarga

Arrow Right Icon
Capa do Ebook gratuito Java Essencial: Fundamentos da Linguagem e do Ecossistema (JDK, IDE, Maven)
44%

Java Essencial: Fundamentos da Linguagem e do Ecossistema (JDK, IDE, Maven)

Novo curso

18 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.