Guia completo para dominar loops condicionais e validações dinâmicas em Java
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.
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.
while (condição) {
// Código executado enquanto a condição for verdadeira
// É importante modificar algo que afete a condição
}
Importante: Se a condição for falsa desde o início, o bloco nunca será executado!
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.
do {
// Código executado PELO MENOS UMA VEZ
// Depois continua enquanto a condição for verdadeira
} while (condição);
Importante: O bloco SEMPRE executa pelo menos uma vez, mesmo que a condição seja falsa!
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); |
Exemplo 1: Contagem Simples
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
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
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
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();
}
}
Exemplo 1: Menu Garantido (sempre mostra uma vez)
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
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
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
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();
}
}
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 |
// 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
}
// 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();
}
// 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!
O comando break
interrompe o loop imediatamente, mesmo que a condição ainda seja verdadeira.
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();
}
}
O comando continue
pula o restante do código no loop atual e vai direto para a próxima iteração.
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
Crie um programa que faça uma contagem regressiva de 10 até 1 usando WHILE, depois imprima "Feliz Ano Novo!"
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!");
}
}
Peça ao usuário uma nota de 0 a 10. Continue pedindo até que ele digite um valor válido. Use DO-WHILE.
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();
}
}
Peça um número ao usuário e mostre sua tabuada (de 1 a 10) usando WHILE.
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();
}
}
Peça números ao usuário. Pare quando ele digitar um número negativo. Conte quantos números positivos foram digitados.
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();
}
}
Crie um sistema que dá ao usuário 3 tentativas para acertar a senha. Use WHILE ou DO-WHILE.
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();
}
}
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 { 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
• 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
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!