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

NullPointerException na inserção

Seguindo o código apresentado na aula, este capítulo, acabo tomando um NullPointerException sempre que tento inserir um Produto dentro de uma categoria. O engraçado é que, debugando, o objeto para inserção vem populado e o erro ocorre no meu método de inserção, dentro da classe Categoria. Classe Categoria

public class Categoria {

    private final Integer id;
    private final String nome;
    private List<Produto> produtos;

    public Categoria(Integer id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    public void adicionaProduto(Produto produto){
        produtos.add(produto);
    }

    @Override
    public String toString() {
        return "[" + id + " - " + nome +"]";
    }

    public Integer getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }
}

Método de listagem de categoria e seus produtos, dentro da Classe CategoriaDAO

public List<Categoria> listaComPordutos() throws SQLException {
        List<Categoria> categoriaComProdutos = new ArrayList<Categoria>();
        Categoria categoriaAtual = null;
        String sql = "select c.id as c_id, c.nome as c_nome, p.id as p_id, p.nome as p_nome, p.descricao as p_descricao from Categoria as c join Produto as p on p.categoria_id = c.id";
        try(PreparedStatement ps = con.prepareStatement(sql)){
            ps.execute();

            try(ResultSet rs = ps.getResultSet()){

                while(rs.next()){
                    int catId = rs.getInt(1);
                    String catNome = rs.getString(2);
                    if(categoriaAtual == null || !categoriaAtual.getNome().equals(catNome)){
                        Categoria categoria = new Categoria(catId, catNome);
                        categoriaComProdutos.add(categoria);
                        categoriaAtual = categoria;
                    }
                     int prodId = rs.getInt(3);
                     String prodNome = rs.getString(4);
                     String prodDescricao = rs.getString(5);
                     Produto p = new Produto(prodNome, prodDescricao);
                     p.setId(prodId);
                     categoriaAtual.adicionaProduto(p);
                }
            }
        }

        return categoriaComProdutos;
    }

Método na classe de Testes

public class TestaCategorias {

    public static void main(String[] args) throws SQLException {

        try(Connection con = new ConnectionPool().getConnection()){
            CategoriaDAO dao = new CategoriaDAO(con);

            List<Categoria> categoriasComProduto = dao.listaComPordutos();

            for (Categoria categoria : categoriasComProduto) {
                System.out.println(categoria);
                for (Produto produto : categoria.getProdutos()) {
                    System.out.println(produto.getNome());
                }
            }
        }
    }
}

Alguém sabe me dizer, onde exatamente estou errando?

2 respostas
solução!

Oi, Paulo.

Você não está instanciando o parâmetro

    private List<Produto> produtos;

Aí quando você chama o método adicionaProduto, ele vai tentar adicionar numa lista que não foi instanciada, resultando num nullpointer.

Você pode incluir a inicialização de uma lista vazia dentro do construtor para resolver.

Verdade... descobri aqui fazendo log no método de inserção. Percebi que não escolhi a implementação da Collection... aí fica difícil. De qualquer modo, muito obrigado pela ajuda!