Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Erro ao executar arquivo Main teste > java.lang.NullPointerException

Estou refazendo por minha conta, sem consultar a atividade de criação do Banco, com os métodos de saque, deposita e etc.

Está tudo certo até o momento de eu inserir os dados da classe Pessoa, que vem com as características de nome, sobrenome, idade e sexo.

Gostaria de entender o erro, pois se eu tiro essa parte do código o resto funciona.

package projetosPessoais;

/*
*código elaborado sem consulta
*
*@author claCoder
*
*/
class Conta {
    private int numero;
    private String agencia;
    private double saldo;
    private double limite;
    private Pessoa titular;


    //Getter and setters

    public Pessoa getTitular() {
        return titular;
    }

    public void setTitular(Pessoa titular) {
        this.titular = titular;
    }

    public double getLimite() {
        return limite;
    }

    public void setLimite(double limite) {
        this.limite = limite;
    }

    public String getAgencia() {
        return agencia;
    }

    public void setAgencia(String agencia) {
        this.agencia = agencia;
    }

    public double getSaldo() {
        return saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }


    //métodos

    public void sacar(double valorSaque) {
        if (this.getSaldo() < valorSaque) {
            System.out.println("Saldo insuficiente");
        } else {
            this.setSaldo(this.getSaldo() - valorSaque);
        }

    }

    public void depositar(double valorDeposito) {
        this.setSaldo(this.getSaldo() + valorDeposito);
    }

    public void transfere(Conta destino, double valorTransfer) {
        if (verifica(destino, valorTransfer)) {
            destino.setSaldo(destino.getSaldo() - valorTransfer);
        } else {
            this.setSaldo(this.getSaldo() + valorTransfer);
        }
    }

    public boolean verifica(Conta destino, double valor) {
        if (destino.getSaldo() <= valor) {
            System.out.println("Saldo insuficiente");
            return false;

        } else {
            return true;
        }
    }
}

class Pessoa {
    private String nome;
    private String sobrenome;
    private String sexo;
    private int idade;


    //Getter and setters
    public int getIdade() {
        return idade;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }
    public String getSexo() {
        return sexo;
    }
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }
    public String getSobrenome() {
        return sobrenome;
    }
    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String novoNome) {
        this.nome = novoNome;
    }
}
package projetosPessoais;

class TestadorMain {

    public static void main(String[] args) {
        Conta c1 = new Conta();
        Conta c2= new Conta();
        Conta c3 = new Conta();


        c1.getTitular().setNome("Lino");
        c1.getTitular().setIdade(24);
        c1.getTitular().setSexo("m");
        c1.getTitular().setSobrenome("Veloso");

        c1.setNumero(123);
        c1.setSaldo(5000);
        c1.setAgencia("4578-8");
        c1.setLimite(50000.0);



        c2.setNumero(321);
        c2.setSaldo(1000);
        c2.setAgencia("9874-3");



        c3.setNumero(954);
        c3.setSaldo(45000);
        c3.setAgencia("78965-1");


        System.out.println("o saldo do titular é: "+c1.getSaldo());
        System.out.println("o saldo do titular é: "+c2.getSaldo());

        //teste de transferência
        c2.transfere(c1, 1500.0);


    }

}
6 respostas
solução!

titular é uma referência para o tipo Pessoa. E ao criar um objeto Conta, todos os seus campos são 0, para primitivos e null para objetos. Então titular ainda é uma referência do tipo Pessoa que aponta para um objeto null;

Então faça, por exemplo:

Pessoa barao = new Pessoa();
barao.setNome("Lino");
 barao.setIdade(24);
 barao.setSexo("m");
 barao.setSobrenome("Veloso");
//e agora sim o seu 
c1.setTitular(barao);

Então primeiro cria um objeto Pessoa, faz todos os set e depois faz o c1.setTitular(pessoa);

Para cada titular, cria(instância) de um objeto Pessoa .

E no caso de tipos booleanos o default é false.

Boa tarde Lino,

O erro ocorre pois, ao você tentar setar o nome do titular, você antes da um get nele, certo?

Contudo, você está tentando acessar um campo de uma variável (titular) que, naquele momento, está apontando para null. Logo ele precisa ser inicializada. Se não, ocorre a NullPointerException.

Você pode fazer isso do seguinte modo:

package projetosPessoais;

class TestadorMain {

    public static void main(String[] args) {
        Conta c1 = new Conta();
        Conta c2= new Conta();
        Conta c3 = new Conta();

        Pessoa titular1 = new Pessoa();
        titular1.setNome("Lino");
        titular1.setIdade(24);
        titular1.setSexo("m");
        titular1.setSobrenome("Veloso");

        c1.setTitular(titular1);

        c1.setNumero(123);
        c1.setSaldo(5000);
        c1.setAgencia("4578-8");
        c1.setLimite(50000.0);

        c2.setNumero(321);
        c2.setSaldo(1000);
        c2.setAgencia("9874-3");

        c3.setNumero(954);
        c3.setSaldo(45000);
        c3.setAgencia("78965-1");

        System.out.println("o saldo da conta 1 é: "+c1.getSaldo());
        System.out.println("o saldo da conta 2 é: "+c2.getSaldo());

        //teste de transferência
        c2.transfere(c1, 1500.0);
    }
}

Outro ponto: vi seu seus métodos transfere e verifica. Você quer mandar de c2 para c1, certo? Então:

    public void transfere(Conta destino, double valorTransfer) {
        if (verifica(this, valorTransfer)) {
            this.setSaldo(this.getSaldo() - valorTransfer);
            destino.setSaldo(destino.getSaldo() + valorTransfer);
            System.out.println("Transferência realizada!")
        } else {
            System.out.println("Transferência não realizada.")
        }
    }

    public boolean verifica(double valor) {
        if (this.getSaldo() <= valor) {
            System.out.println("Saldo insuficiente");
            return false;
        } else {
            return true;
        }
    }

Avisa aí se deu certo.

Abraço.

Só pra complementar a resposta, uma solução mais parecida com o que você estava fazendo é antes de acessar o titular setar uma Pessoa como titular:

//cria uma pessoa e guarda em pessoa1
Pessoa pessoa1 = new Pessoa();
//seta o titular
c1.setTitular(pessoa1);
//a partir daqui seu codigo fica funcional, pois o getTitular nao vai mais retornar null

c1.getTitular().setNome("Lino");
c1.getTitular().setIdade(24);
c1.getTitular().setSexo("m");
c1.getTitular().setSobrenome("Veloso");

Bem observado, Cayo. Fica mais na linha em que ele estava escrevendo.

Obrigado Romulo e Rafael. Com as explicações de vocês agora consegui entender bem o conceito.

Sim Cayo, da maneira que você me indicou consegui aproveitar o código já feito. POO tá começando a entrar na minha cabeça rsrs.

Valeu pessoal.