2
respostas

Lambda com NullPointerException

Ola pessoal!

Tenho o programa abaixo e dá erro na linha 44 conforme abaixo, alguém saberia o porque? Obrigado!

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

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

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

public class Teste {

public static void main(String[] args) {

    Conta cc1 = new ContaCorrente(22, 33);
    cc1.deposita(333.0);
    Conta cc2 = new ContaPoupanca(22, 44);
    cc2.deposita(444.0);
    Conta cc3 = new ContaCorrente(22, 11);
    cc3.deposita(111.0);
    Conta cc4 = new ContaPoupanca(22, 22);
    cc4.deposita(222.0);

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

    // Function Object - só serve para encapsular uma função

// NumeroDaContaComparator2 comparator = new NumeroDaContaComparator2(); // NumeroDaContaComparator2 comparator = new NumeroDaContaComparator2();

    lista.sort((c1, c2) -> Integer.compare(c1.getNumero(), c2.getNumero()));

    Comparator<Conta> comp = (Conta c1, Conta c2) -> {
        String nomeC1 = c1.getTitular().getNome();
        String nomeC2 = c2.getTitular().getNome();
        return nomeC1.compareTo(nomeC2);
    };

// lista.sort(comp); lista.forEach((conta) -> System.out.println(conta + ", " + conta.getTitular().getNome())); } }

Exception in thread "main" java.lang.NullPointerException at br.com.bytebank.banco.test.util.Teste.lambda$2(Teste.java:44) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at br.com.bytebank.banco.test.util.Teste.main(Teste.java:44)

2 respostas

Boa tarde MesaCoutinho, blz?

para mim nem todo seu código está aparecendo formatado, mas pelo que eu pude entender, acredito que o erro esteja aqui.

lista.forEach((conta) -> System.out.println(conta + ", " + conta.getTitular().getNome())); } }

no caso, as contas criadas no método main, parecem não ter titular vinculado a elas, desta forma quando vc chama getTitular().getNome() vc chama um método numa referência nula e toma a exceção.

Beleza Matheus, na mosca, obrigado!

Abaixo o código corrigido:

package br.com.bytebank.banco.test.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 TesteLambdas {

public static void main(String[] args) {

    Conta cc1 = new ContaCorrente(22, 33);
    cc1.deposita(333.0);
    Cliente cl1 = new Cliente();
    cl1.setNome("marcio");
    cc1.setTitular(cl1);

    Conta cc2 = new ContaPoupanca(22, 44);
    cc2.deposita(444.0);
    Cliente cl2 = new Cliente();
    cl2.setNome("maria");
    cc2.setTitular(cl2);

    Conta cc3 = new ContaCorrente(22, 11);
    cc3.deposita(111.0);
    Cliente cl3 = new Cliente();
    cl3.setNome("joão");
    cc3.setTitular(cl3);

    Conta cc4 = new ContaPoupanca(22, 22);
    cc4.deposita(222.0);
    Cliente cl4 = new Cliente();
    cl4.setNome("lucas");
    cc4.setTitular(cl4);

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

    // Function Object - só serve para encapsular uma função

// NumeroDaContaComparator2 comparator = new NumeroDaContaComparator2(); // NumeroDaContaComparator2 comparator = new NumeroDaContaComparator2();

    lista.sort((c1, c2) -> Integer.compare(c1.getNumero(), c2.getNumero()));

    Comparator<Conta> comp = (Conta c1, Conta c2) -> {
        String nomeC1 = c1.getTitular().getNome();
        String nomeC2 = c2.getTitular().getNome();
        return nomeC1.compareTo(nomeC2);
    };

// lista.sort(comp); lista.forEach((conta) -> System.out.println(conta + ", " + conta.getTitular().getNome())); } }

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software