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

Erro - Cannot invoke "br.com.bytebank.banco.modelo.Cliente.getNome()" because the return value of "br.com.bytebank.banco.modelo.Conta.getTitular()" is null

Olá no meu está dando o seguinte erro e não estou conseguindo resolver.

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "br.com.bytebank.banco.modelo.Cliente.getNome()" because the return value of "br.com.bytebank.banco.modelo.Conta.getTitular()" is null at br.com.bytebank.banco.teste.util.TitularDaContaComparator.compare(TesteOrdenacao.java:58) at br.com.bytebank.banco.teste.util.TitularDaContaComparator.compare(TesteOrdenacao.java:1) at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) at java.base/java.util.TimSort.sort(TimSort.java:220) at java.base/java.util.Arrays.sort(Arrays.java:1307) at java.base/java.util.ArrayList.sort(ArrayList.java:1721) at br.com.bytebank.banco.teste.util.TesteOrdenacao.main(TesteOrdenacao.java:45)

O meu código está assim

package br.com.bytebank.banco.teste.util;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import br.com.bytebank.banco.modelo.Cliente;
import br.com.bytebank.banco.modelo.Conta;
import br.com.bytebank.banco.modelo.ContaCorrente;
import br.com.bytebank.banco.modelo.ContaPoupanca;

public class TesteOrdenacao {

    public static void main(String[] args) {
        Conta cc1 = new ContaCorrente(22,33);
        Cliente clienteCC1 = new Cliente();
        clienteCC1.setNome("Nico");
        cc1.setTitular(clienteCC1);
        cc1.depositar(333.0);

        Conta cc2 = new ContaCorrente(22,44);
        Cliente clienteCC2 = new Cliente();
        clienteCC1.setNome("Guilherme");
        cc1.setTitular(clienteCC2);
        cc1.depositar(444.0);

        Conta cc3 = new ContaCorrente(22,11);
        Cliente clienteCC3= new Cliente();
        clienteCC3.setNome("Paulo");
        cc1.setTitular(clienteCC3);
        cc1.depositar(111.0);

        Conta cc4 = new ContaPoupanca(22,22);
        Cliente clienteCC4 = new Cliente();
        clienteCC4.setNome("Ana");
        cc1.setTitular(clienteCC4);
        cc1.depositar(222.0);

        List<Conta> lista = new ArrayList<>();
        lista.add(cc1);
        lista.add(cc2);
        lista.add(cc3);
        lista.add(cc4);

        lista.sort(new TitularDaContaComparator());
        System.out.println("........................");

        for(Conta conta : lista) {
            System.out.println(conta + ", " + conta.getTitular().getNome());
        }
    }

}
 class TitularDaContaComparator implements Comparator<Conta>{

    @Override
    public int compare(Conta c1, Conta c2) {
        String nomeC1 = c1.getTitular().getNome();
        String nomeC2 = c2.getTitular().getNome();
        return nomeC1.compareTo(nomeC2);

    }

 }
3 respostas

Boa noite Paulo!

Você verificou se o método setTitular está implementado na classe Conta (classe mãe) e está apontando para o atributo Cliente titular direitinho?

Espero ter ajudado!

na minha classe Conta o setTitular está assim

    public void setTitular(Cliente titular) {
        this.titular = titular;
    }
solução!

Olá Paulo!

Veja onde está o erro:

Nas instâncias cc2, cc3 e cc4, você está chamando o cc1.setTitular mas deveria ser o correspondente de cada instância...

    Conta cc2 = new ContaCorrente(22,44);
    Cliente clienteCC2 = new Cliente();
    clienteCC1.setNome("Guilherme");

==> cc1.setTitular(clienteCC2); //Deveria ser cc2.setTitular... ==> cc1.depositar(444.0);

    Conta cc3 = new ContaCorrente(22,11);
    Cliente clienteCC3= new Cliente();
    clienteCC3.setNome("Paulo");

==> cc1.setTitular(clienteCC3); ==> cc1.depositar(111.0);

    Conta cc4 = new ContaPoupanca(22,22);
    Cliente clienteCC4 = new Cliente();
    clienteCC4.setNome("Ana");

==> cc1.setTitular(clienteCC4); ==> cc1.depositar(222.0);

Espero ter ajudado!

Por favor, não esqueça de marcar sua pergunta como solucionado no fórum para eu receber seu feedback beleza?

Abraços!