1
resposta

erro ao fazer a composição com a classe autenticaçãoUtil

quando vou implementar os métodos da interface "Autenticavel" diretamente nas classes "Cliente", "Administrador" e "Gerente", eles compilam normal, mas ao quando delego esses métodos à classe "AutenticacaoUtil" aparece esse erro:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "moneyBank_herdado.autenticacaoUtil.setSenha(int)" because "this.autenticador" is null at moneyBank_herdado/moneyBank_herdado.Cliente.setSenha(Cliente.java:33) at moneyBank_herdado/moneyBank_herdado.testeDoSistema.main(testeDoSistema.java:10)

package moneyBank_herdado;

public class Cliente implements Autenticavel {

    private String nome;
    private String cpf;
    private autenticacaoUtil autenticador;

    // CONSTRUTOR DO NOME E CPF
    public Cliente(String nome, String cpf) {
        this.nome = nome;
        this.cpf = cpf;

        System.out.println("novo cliente. nome: " + nome + ", cpf: " + cpf);
    }

    // CONSTRUTOR PARA A REUTILIZAÇÃO DE CODIGO DE AUTENTICAÇÃO
    public Cliente() {
        this.autenticador = new autenticacaoUtil();
    }


    // IMPLEMENTAÇÃO DO AUTENTICAVEL UTILIZANDO A CLASSE autenticacaoUtil
    @Override
    public boolean autentica(int senha) {
        return this.autenticador.autentica(senha);
    }

    @Override
    public void setSenha(int senha) {
        this.autenticador.setSenha(senha);
    }

}
package moneyBank_herdado;

public class autenticacaoUtil {

    private int senha;

    // IMPLEMENTAÇÃO DO AUTENTICAVEL

    public boolean autentica(int senha) {
        if (this.senha == senha) {
            return true;

        }else {

            return false;
        }
    }

    public void setSenha(int senha) {
        this.senha = senha;
    }

}
package moneyBank_herdado;

public class sistemaInterno {

    private int senha = 2222;


    public void autentica(Autenticavel f) {
        boolean autenticou = f.autentica(this.senha);

        if(autenticou) {
            System.out.println("acesso permitido");
        }else{ 
            System.out.println("acesso negado");
        }
    }

}
1 resposta

Bom dia, tudo certo !

Oque ocorre aqui é que na sua classe de inicialização da variavel autenticador dentro da classe Cliente... você esqueceu de instânciar a classe por isso ela é nula e como se sabe não se pode consultar um metodo em cima de um objeto null.

Atual: private autenticacaoUtil autenticador;

Alterado: private autenticacaoUtil autenticador = new autenticacaoUtil();

Espero que ajude.