1
resposta

[Sugestão] RESOLUÇÃO TENTATIVAS DE LOGIN

import java.util.Scanner;

public class MainExercicioSenha {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        var senhaCorreta = 1234;
        var tentativas = 2;

        for (int i = 3; i > 0; i--) {
            System.out.println("Digite sua senha para acessar: ");
            var senhaDigitada = input.nextInt();

            if (tentativas == 0) {
                System.out.println("Conta bloqueada temporariamente");
                break;
            } else if (senhaDigitada == senhaCorreta) {
                System.out.println("Senha correta! Acesso liberado");
                break;
            } else {
                System.out.println("Senha incorreta! Você possuí mais " + tentativas + " tentativas");
                tentativas--;
            }
        }
        input.close();
    }
}
1 resposta

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!