Olá, Cauan! Como vai?
Parabéns pela resolução do desafio! O seu código para monitorar as tentativas de login está muito bem estruturado, limpo e utiliza corretamente o laço for junto com os comandos de interrupção (break).
Como você trabalha na área de Suporte Técnico, sabe melhor do que ninguém o quão crítico é o sistema de segurança de senhas. Se o script falhar, ou o usuário fica trancado para fora do sistema injustamente, ou um invasor ganha tentativas infinitas para hackear a conta.
Olhando com atenção para a lógica do seu código, você construiu um raciocínio excelente, mas há um bug sutil de contagem que mudaria o comportamento esperado do sistema na prática. Vamos analisar juntos para entender o que acontece nos bastidores?
O Bug da Contagem Regressiva
Se executarmos o seu programa exatamente como ele está escrito e errarmos todas as senhas, veja o que o console vai imprimir passo a passo:
- 1ª Tentativa (i = 3): Digitamos
0000. O Java pula o primeiro if (porque tentativas é 2), pula o else if (senha errada) e cai no else. Ele imprime: "Senha incorreta! Você possui mais 2 tentativas". Logo em seguida, a sua variável tentativas cai para 1. - 2ª Tentativa (i = 2): Digitamos
0000. O Java pula para o else de novo. Ele imprime: "Senha incorreta! Você possui mais 1 tentativas". A sua variável tentativas cai para 0. - 3ª Tentativa (i = 1): Digitamos
0000. Agora o Java entra no primeiro if, porque tentativas == 0. Ele imprime: "Conta bloqueada temporariamente" e dá o break.
Onde está o problema? Note que na terceira tentativa, o programa bloqueou a conta antes de ler se a senha digitada estava certa ou errada. Se o usuário tivesse digitado a senha correta (1234) nessa última chance, ele seria bloqueado do mesmo jeito! O sistema ignorou o chute dele.
Além disso, a sua variável de controle do loop (i) e a variável tentativas estão fazendo exatamente a mesma contagem de forma duplicada.
A Solução Limpa e Segura (Clean Code)
Para corrigir isso e adotar as melhores práticas de desenvolvimento, nós podemos eliminar a variável tentativas e usar a própria variável i do laço for para dizer ao usuário quantas chances ele ainda tem.
Veja como o fluxo do seu algoritmo fica muito mais simples, seguro e elegante:
import java.util.Scanner;
public class MainExercicioSenha {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int senhaCorreta = 1234;
// O loop começa com 3 tentativas e vai diminuindo até 1
for (int tentativas = 3; tentativas > 0; tentativas--) {
System.out.println("Digite sua senha para acessar: ");
int senhaDigitada = input.nextInt();
if (senhaDigitada == senhaCorreta) {
System.out.println("Senha correta! Acesso liberado");
break;
} else {
// Se a pessoa errou e era a última tentativa (tentativas - 1 == 0), bloqueia
if (tentativas - 1 == 0) {
System.out.println("Conta bloqueada temporariamente por excesso de tentativas.");
} else {
System.out.println("Senha incorreta! Você ainda possui " + (tentativas - 1) + " tentativa(s).");
}
}
}
input.close();
}
}
O que mudou?
- Economia de código: Eliminamos variáveis redundantes.
- Justiça no login: O usuário agora pode acertar a senha na 3ª e última tentativa normalmente. O bloqueio só acontece se ele errar o último palpite.
- Uso correto do
var: Uma dica técnica para o Java: quando trabalhamos com números puros e diretos (como 1234 ou 3), declarar o tipo primitivo explicitamente como int é uma prática muito bem vista no mercado para manter o código tipado com clareza.
Sua iniciativa de criar a estrutura condicional aninhada foi ótima e o uso do break foi perfeito. Ajustando esse detalhe da contagem, o seu script de segurança fica nível sênior!
Continue praticando e aplicando os laços de repetição nos seus estudos.
Espero que possa ter lhe ajudado!