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

Erro ao tentar acessar a tabela Categoria

erro do console Exception in thread "main" java.lang.NullPointerException: Cannot invoke "br.com.alura.jdbc.dao.CategoriaDAO.listar()" because "this.categoriaDAO" is null

package br.com.alura.jdbc.controller;

import java.sql.Connection; import java.util.List;

import br.com.alura.jdbc.dao.CategoriaDAO; import br.com.alura.jdbc.factory.ConnectionFactory; import br.com.alura.jdbc.modelo.Categoria;

public class CategoriaController {

private CategoriaDAO categoriaDAO;

public CategoriaController(){

    Connection connection = new ConnectionFactory().recuperarConexao();

    new CategoriaDAO(connection);

}

public List<Categoria> listar() {

    return this.categoriaDAO.listar();
}

}

package br.com.alura.jdbc.dao;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;

import br.com.alura.jdbc.modelo.Categoria; import br.com.alura.jdbc.modelo.Produto;

public class CategoriaDAO {

private Connection connection;

public CategoriaDAO(Connection connection) {
    this.connection = connection;
}

public List<Categoria> listar()  {
    try {

        List<Categoria> categorias = new ArrayList<>();
        String sql = "SELECT ID, NOME FROM CATEGORIA";

        try (PreparedStatement pstm = connection.prepareStatement(sql)) {
            pstm.execute();

            try (ResultSet rst = pstm.getResultSet()) {
                while (rst.next()) {
                    Categoria categoria = new Categoria(rst.getInt(1), rst.getString(2));

                    categorias.add(categoria);
                }
            }
        }
        return categorias;

    } catch (SQLException e) {
            throw new RuntimeException(e);
    }
}

public List<Categoria> listarComProduto() throws SQLException {
    Categoria ultima = null;
    List<Categoria> categorias = new ArrayList<>();

    String sql = "SELECT C.ID, C.NOME, P.ID, P.NOME, P.DESCRICAO " + "FROM CATEGORIA C "
            + "INNER JOIN PRODUTO P ON C.ID = P.CATEGORIA_ID";

    try (PreparedStatement pstm = connection.prepareStatement(sql)) {
        pstm.execute();

        try (ResultSet rst = pstm.getResultSet()) {
            while (rst.next()) {
                if (ultima == null || !ultima.getNome().equals(rst.getString(2))) {
                    Categoria categoria = new Categoria(rst.getInt(1), rst.getString(2));

                    categorias.add(categoria);
                    ultima = categoria;
                }
                Produto produto = new Produto(rst.getInt(3), rst.getString(4), rst.getString(5));
                ultima.adicionar(produto);
            }
        }
        return categorias;
    }
}

}

2 respostas
solução!

Moisés, boa tarde. você declarou CategoriaDao como variável, mas esqueceu de inicializa-la. Se vc alterar o seu código para o abaixo, irá funcionar.

private CategoriaDAO categoriaDAO;

public CategoriaController(){

    Connection connection = new ConnectionFactory().recuperarConexao();

    categoriaDAO = new CategoriaDAO(connection);

}

public List<Categoria> listar() {

    return this.categoriaDAO.listar();
}

Era isso mesmo professor, falta de atenção minha. muito obrigado.

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