WHILE e DO-WHILE em Java

Guia completo para dominar loops condicionais e validações dinâmicas em Java

1. O Básico: Entendendo os Loops Condicionais

Enquanto o laço for é ideal quando sabemos exatamente quantas vezes queremos repetir algo, os laços while e do-while são perfeitos para situações onde a repetição depende de uma condição que pode mudar durante a execução.

Imagine que você está pedindo uma senha ao usuário. Você não sabe quantas tentativas ele precisará até acertar. Você quer continuar pedindo "enquanto" a senha estiver errada. Esse é o cenário perfeito para usar while ou do-while.

A diferença principal entre eles é simples mas crucial: o while verifica a condição antes de executar o bloco, enquanto o do-while executa o bloco pelo menos uma vez antes de verificar a condição.

2. WHILE: O Loop com Verificação Prévia

2.1. O que é while?

O while (enquanto) é um loop que continua executando enquanto uma condição específica for verdadeira. A condição é verificada ANTES de cada execução do bloco de código.

Sintaxe do while:
java
while (condição) {
    // Código executado enquanto a condição for verdadeira
    // É importante modificar algo que afete a condição
}

Como o WHILE funciona:

  • Passo 1: Verifica se a condição é verdadeira
  • Passo 2: Se SIM, executa o bloco de código
  • Passo 3: Volta ao Passo 1
  • Passo 4: Se NÃO, pula o bloco e continua o programa

Importante: Se a condição for falsa desde o início, o bloco nunca será executado!

2.2. Quando usar WHILE?

3. DO-WHILE: O Loop com Verificação Posterior

3.1. O que é do-while?

O do-while (faça-enquanto) é semelhante ao while, mas com uma diferença crucial: o bloco de código é executado PELO MENOS UMA VEZ, pois a condição é verificada no final.

Sintaxe do do-while:
java
do {
    // Código executado PELO MENOS UMA VEZ
    // Depois continua enquanto a condição for verdadeira
} while (condição);

Como o DO-WHILE funciona:

  • Passo 1: Executa o bloco de código (SEM verificar nada antes)
  • Passo 2: Verifica se a condição é verdadeira
  • Passo 3: Se SIM, volta ao Passo 1
  • Passo 4: Se NÃO, termina o loop

Importante: O bloco SEMPRE executa pelo menos uma vez, mesmo que a condição seja falsa!

3.2. Quando usar DO-WHILE?

4. WHILE vs DO-WHILE: Comparação Visual

Fluxo do WHILE:

→ VERIFICA condição
→ Se VERDADEIRA: Executa bloco
→ Volta para verificar novamente
→ Se FALSA: Sai do loop (pode nunca executar)

Fluxo do DO-WHILE:

→ EXECUTA bloco (sempre uma vez no mínimo)
→ VERIFICA condição
→ Se VERDADEIRA: Volta para executar novamente
→ Se FALSA: Sai do loop
Aspecto WHILE DO-WHILE
Verificação Antes de executar Depois de executar
Mínimo de execuções 0 vezes (pode nunca executar) 1 vez (sempre executa)
Uso típico Quando pode não precisar executar Quando precisa executar pelo menos uma vez
Sintaxe while (condição) { } do { } while (condição);

5. Exemplos Práticos com WHILE

Exemplo 1: Contagem Simples

java
public class ContagemWhile {
    public static void main(String[] args) {
        int contador = 1;
        
        while (contador <= 5) {
            System.out.println("Contagem: " + contador);
            contador++; // IMPORTANTE: atualizar a variável
        }
        
        System.out.println("Fim!");
    }
}

// Saída:
// Contagem: 1
// Contagem: 2
// Contagem: 3
// Contagem: 4
// Contagem: 5
// Fim!

Exemplo 2: Validação de Senha

java
import java.util.Scanner;

public class ValidacaoSenha {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String senhaCorreta = "java123";
        String senhaDigitada = "";
        
        // Continua pedindo enquanto a senha estiver errada
        while (!senhaDigitada.equals(senhaCorreta)) {
            System.out.print("Digite a senha: ");
            senhaDigitada = sc.nextLine();
            
            if (!senhaDigitada.equals(senhaCorreta)) {
                System.out.println("Senha incorreta! Tente novamente.\n");
            }
        }
        
        System.out.println("Acesso liberado!");
        sc.close();
    }
}

Exemplo 3: Soma até o Usuário Digitar Zero

java
import java.util.Scanner;

public class SomaNumeros {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numero = -1; // Inicia com valor diferente de zero
        int soma = 0;
        
        System.out.println("Digite números para somar (0 para parar):");
        
        while (numero != 0) {
            System.out.print("Número: ");
            numero = sc.nextInt();
            soma += numero;
        }
        
        System.out.println("Soma total: " + soma);
        sc.close();
    }
}

Exemplo 4: Menu com WHILE

java
import java.util.Scanner;

public class MenuWhile {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int opcao = 0;
        
        while (opcao != 4) {
            System.out.println("\n=== MENU ===");
            System.out.println("1. Cadastrar");
            System.out.println("2. Listar");
            System.out.println("3. Excluir");
            System.out.println("4. Sair");
            System.out.print("Escolha: ");
            opcao = sc.nextInt();
            
            if (opcao == 1) {
                System.out.println("Cadastrando...");
            } else if (opcao == 2) {
                System.out.println("Listando...");
            } else if (opcao == 3) {
                System.out.println("Excluindo...");
            } else if (opcao == 4) {
                System.out.println("Saindo...");
            } else {
                System.out.println("Opção inválida!");
            }
        }
        
        sc.close();
    }
}

6. Exemplos Práticos com DO-WHILE

Exemplo 1: Menu Garantido (sempre mostra uma vez)

java
import java.util.Scanner;

public class MenuDoWhile {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int opcao;
        
        do {
            System.out.println("\n=== CALCULADORA ===");
            System.out.println("1. Somar");
            System.out.println("2. Subtrair");
            System.out.println("3. Multiplicar");
            System.out.println("4. Dividir");
            System.out.println("0. Sair");
            System.out.print("Escolha: ");
            opcao = sc.nextInt();
            
            if (opcao >= 1 && opcao <= 4) {
                System.out.println("Executando operação " + opcao + "...");
            } else if (opcao != 0) {
                System.out.println("Opção inválida!");
            }
            
        } while (opcao != 0);
        
        System.out.println("Até logo!");
        sc.close();
    }
}

Exemplo 2: Validação de Idade

java
import java.util.Scanner;

public class ValidacaoIdade {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int idade;
        
        do {
            System.out.print("Digite sua idade (0-120): ");
            idade = sc.nextInt();
            
            if (idade < 0 || idade > 120) {
                System.out.println("Idade inválida! Tente novamente.\n");
            }
            
        } while (idade < 0 || idade > 120);
        
        System.out.println("Idade válida: " + idade + " anos");
        sc.close();
    }
}

Exemplo 3: Jogo de Adivinhação

java
import java.util.Scanner;
import java.util.Random;

public class JogoAdivinhacao {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Random random = new Random();
        
        int numeroSecreto = random.nextInt(100) + 1; // 1 a 100
        int palpite;
        int tentativas = 0;
        
        System.out.println("=== JOGO DA ADIVINHAÇÃO ===");
        System.out.println("Adivinhe o número de 1 a 100!");
        
        do {
            System.out.print("\nSeu palpite: ");
            palpite = sc.nextInt();
            tentativas++;
            
            if (palpite < numeroSecreto) {
                System.out.println("Muito baixo!");
            } else if (palpite > numeroSecreto) {
                System.out.println("Muito alto!");
            } else {
                System.out.println("PARABÉNS! Você acertou em " + tentativas + " tentativas!");
            }
            
        } while (palpite != numeroSecreto);
        
        sc.close();
    }
}

Exemplo 4: Repetir até Confirmação

java
import java.util.Scanner;

public class ConfirmacaoUsuario {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String resposta;
        
        do {
            System.out.println("\nProcessando dados importantes...");
            System.out.println("Operação concluída!");
            
            System.out.print("\nDeseja repetir? (s/n): ");
            resposta = sc.nextLine().toLowerCase();
            
        } while (resposta.equals("s") || resposta.equals("sim"));
        
        System.out.println("Programa encerrado.");
        sc.close();
    }
}

7. Comparação: FOR vs WHILE vs DO-WHILE

Aspecto FOR WHILE DO-WHILE
Melhor para Repetições com contador fixo Condições dinâmicas Executar pelo menos uma vez
Verificação Início de cada iteração Antes de executar Depois de executar
Mínimo execuções 0 vezes 0 vezes 1 vez
Exemplo típico Percorrer array Validar entrada Menu interativo
Controle Contador automático Condição manual Condição manual

Quando usar cada um?

  • FOR: "Preciso fazer isso 10 vezes" ou "Para cada item da lista"
  • WHILE: "Enquanto a senha estiver errada, peça novamente"
  • DO-WHILE: "Mostre o menu, depois pergunte se quer continuar"

8. Erros Comuns e Boas Práticas

❌ Erro 1: Loop Infinito no WHILE

java
// ERRADO! A condição nunca muda
int contador = 0;
while (contador < 10) {
    System.out.println("Loop infinito!");
    // Esqueceu de incrementar contador!
}

// CORRETO:
int contador = 0;
while (contador < 10) {
    System.out.println("Contagem: " + contador);
    contador++; // SEMPRE atualize a variável de controle
}

❌ Erro 2: Condição Sempre Verdadeira

java
// CUIDADO! Pode gerar loop infinito
Scanner sc = new Scanner(System.in);
String resposta = "sim";

while (resposta.equals("sim")) {
    System.out.println("Fazendo algo...");
    // Se esquecer de pedir nova resposta, loop infinito!
}

// CORRETO:
while (resposta.equals("sim")) {
    System.out.println("Fazendo algo...");
    System.out.print("Continuar? (sim/não): ");
    resposta = sc.nextLine();
}

❌ Erro 3: Ponto e Vírgula no DO-WHILE

java
// ERRADO! Falta o ponto e vírgula
do {
    System.out.println("Teste");
} while (true) // ERRO DE COMPILAÇÃO!

// CORRETO:
do {
    System.out.println("Teste");
} while (false); // Note o ponto e vírgula!

✅ Boas Práticas:

  • Sempre garanta que a condição do loop pode se tornar falsa
  • Inicialize variáveis de controle antes do loop
  • No DO-WHILE, não esqueça o ponto e vírgula após o while
  • Use nomes descritivos para condições booleanas
  • Evite loops infinitos acidentais - sempre atualize as variáveis de controle
  • Prefira WHILE quando pode não precisar executar, DO-WHILE quando precisa executar ao menos uma vez

9. Controle de Fluxo: BREAK e CONTINUE

9.1. BREAK - Sair do Loop

O comando break interrompe o loop imediatamente, mesmo que a condição ainda seja verdadeira.

java
import java.util.Scanner;

public class ExemploBreak {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numero;
        
        while (true) { // Loop infinito proposital
            System.out.print("Digite um número (0 para sair): ");
            numero = sc.nextInt();
            
            if (numero == 0) {
                System.out.println("Saindo...");
                break; // Sai do loop
            }
            
            System.out.println("Você digitou: " + numero);
        }
        
        sc.close();
    }
}

9.2. CONTINUE - Pular para Próxima Iteração

O comando continue pula o restante do código no loop atual e vai direto para a próxima iteração.

java
public class ExemploContinue {
    public static void main(String[] args) {
        int i = 0;
        
        while (i < 10) {
            i++;
            
            if (i % 2 == 0) {
                continue; // Pula números pares
            }
            
            System.out.println("Número ímpar: " + i);
        }
    }
}

// Saída: Número ímpar: 1, 3, 5, 7, 9

10. Exercícios Práticos

📝 Exercício 1: Contagem Regressiva com WHILE

Crie um programa que faça uma contagem regressiva de 10 até 1 usando WHILE, depois imprima "Feliz Ano Novo!"

Mostrar Solução
java
public class ContagemRegressiva {
    public static void main(String[] args) {
        int contador = 10;
        
        while (contador >= 1) {
            System.out.println(contador);
            contador--;
        }
        
        System.out.println("Feliz Ano Novo!");
    }
}

📝 Exercício 2: Validação de Nota com DO-WHILE

Peça ao usuário uma nota de 0 a 10. Continue pedindo até que ele digite um valor válido. Use DO-WHILE.

Mostrar Solução
java
import java.util.Scanner;

public class ValidacaoNota {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double nota;
        
        do {
            System.out.print("Digite uma nota (0-10): ");
            nota = sc.nextDouble();
            
            if (nota < 0 || nota > 10) {
                System.out.println("Nota inválida! Tente novamente.\n");
            }
            
        } while (nota < 0 || nota > 10);
        
        System.out.println("Nota válida: " + nota);
        sc.close();
    }
}

📝 Exercício 3: Tabuada com WHILE

Peça um número ao usuário e mostre sua tabuada (de 1 a 10) usando WHILE.

Mostrar Solução
java
import java.util.Scanner;

public class TabuadaWhile {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("Digite um número: ");
        int numero = sc.nextInt();
        
        int i = 1;
        System.out.println("\n=== TABUADA DO " + numero + " ===");
        
        while (i <= 10) {
            System.out.println(numero + " x " + i + " = " + (numero * i));
            i++;
        }
        
        sc.close();
    }
}

📝 Exercício 4: Contador de Números Positivos

Peça números ao usuário. Pare quando ele digitar um número negativo. Conte quantos números positivos foram digitados.

Mostrar Solução
java
import java.util.Scanner;

public class ContadorPositivos {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numero = 0;
        int contador = 0;
        
        System.out.println("Digite números (negativo para parar):");
        
        while (numero >= 0) {
            System.out.print("Número: ");
            numero = sc.nextInt();
            
            if (numero >= 0) {
                contador++;
            }
        }
        
        System.out.println("Total de números positivos: " + contador);
        sc.close();
    }
}

📝 Exercício 5: Sistema de Login com 3 Tentativas

Crie um sistema que dá ao usuário 3 tentativas para acertar a senha. Use WHILE ou DO-WHILE.

Mostrar Solução
java
import java.util.Scanner;

public class SistemaLogin {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String senhaCorreta = "senai2024";
        String senha;
        int tentativas = 0;
        boolean acertou = false;
        
        while (tentativas < 3 && !acertou) {
            System.out.print("Digite a senha: ");
            senha = sc.nextLine();
            tentativas++;
            
            if (senha.equals(senhaCorreta)) {
                System.out.println("Login realizado com sucesso!");
                acertou = true;
            } else {
                int restantes = 3 - tentativas;
                if (restantes > 0) {
                    System.out.println("Senha incorreta! " + restantes + " tentativa(s) restante(s).\n");
                }
            }
        }
        
        if (!acertou) {
            System.out.println("Acesso bloqueado! Número máximo de tentativas excedido.");
        }
        
        sc.close();
    }
}

11. Resumo Visual

🔍 WHILE:

while (condição) { código }

• Verifica a condição ANTES de executar

• Pode nunca executar (se condição for falsa desde o início)

• Ideal para validações e condições incertas

🔍 DO-WHILE:

do { código } while (condição);

• Executa ANTES de verificar a condição

• Sempre executa pelo menos UMA vez

• Ideal para menus e ações que precisam acontecer primeiro

🌍 Uso no Mundo Real:

WHILE: Validar login, processar arquivos até o fim, aguardar resposta do servidor

DO-WHILE: Menus interativos, jogos que precisam de pelo menos uma rodada, confirmações de usuário

BREAK: Sair de loops aninhados, parar busca quando encontrar resultado

CONTINUE: Pular itens inválidos, filtrar dados durante processamento

🎯 Conclusão

Dominar WHILE e DO-WHILE é essencial para criar programas dinâmicos e interativos. Eles complementam o FOR perfeitamente, dando flexibilidade para situações onde o número de repetições é desconhecido.

Lembre-se: Use WHILE quando pode não precisar executar, e DO-WHILE quando precisa executar pelo menos uma vez!

Continue praticando e logo você estará escolhendo o loop certo para cada situação naturalmente!