4
respostas

Exception

Ao rodar o código me retorna isto:

out 07, 2021 10:59:21 PM com.mchange.v2.log.MLog INFORMAÇÕES: MLog clients using java 1.4+ standard logging. out 07, 2021 10:59:22 PM com.mchange.v2.c3p0.C3P0Registry INFORMAÇÕES: Initializing c3p0-0.9.5.4 [built 23-March-2019 23:00:48 -0700; debug? true; trace: 10] out 07, 2021 10:59:22 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource INFORMAÇÕES: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge13aakpz7gqz7e36t2|4b85612c, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge13aakpz7gqz7e36t2|4b85612c, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost/loja_virtual?useTimezone=true&serverTimezone=UTC, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=**, password=**}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ] Executando a query de listar categoria Exception in thread "main" java.lang.NullPointerException at br.com.alura.jdbc.modelo.Categoria.adicionar(Categoria.java:26) at dao.CategoriaDAO.listarComProdutos(CategoriaDAO.java:62) at TestaListagemDeCategorias.main(TestaListagemDeCategorias.java:17)

4 respostas

Carlos, bom dia. Você pode colocar aqui o conteúdo das suas classes TestaListagemDeCategorias, CategoriaDAO e Categoria.

Bom dia professor, claro!

import java.io.ObjectInputStream.GetField; import java.sql.Connection; import java.sql.SQLException; import java.util.List;

import br.com.alura.jdbc.modelo.Categoria; import br.com.alura.jdbc.modelo.Produto; import dao.CategoriaDAO; import dao.ProdutoDao;

public class TestaListagemDeCategorias {

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

    try (Connection connection = new ConnectionFactory().recuperarConexao()) {
        CategoriaDAO categoriaDAO = new CategoriaDAO(connection);
        List<Categoria> listaDeCategorias = categoriaDAO.listarComProdutos();

        listaDeCategorias.stream().forEach(ct -> {
            System.out.println(ct.getNome());

                for (Produto produto : ct.getProdutos()) {
                    System.out.println(ct.getNome() + "-" + produto.getNome());
                }

        });

    }
}

}

package 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() throws SQLException{
    List<Categoria> categorias = new ArrayList<>();
    System.out.println("Executando a query de listar categoria");

    String sql = "SELECT ID, 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;
}

public List<Categoria> listarComProdutos() throws SQLException {
    Categoria ultima = null;

    List<Categoria> categorias = new ArrayList<>();


    System.out.println("Executando a query de listar categoria");

    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));

                ultima = categoria;
                categorias.add(categoria);

            }

                Produto produto
                = new Produto(rst.getInt(3), rst.getString(4), rst.getString(5));
                ultima.adicionar(produto);

            }
        }
    }
    return categorias;
}

} package br.com.alura.jdbc.modelo;

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

public class Categoria {

private Integer id;
private String nome;
private List<Produto> produto = new ArrayList<Produto>();
private List<Produto> produtos;

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

}

public String getNome() { return nome; } public int getId() {

return id;

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

} public List getProdutos() { return produtos; } }

No método listar, da classe CategoriaDAO, a query está diferente String sql = "SELECT ID, ID, NOME FROM CATEGORIA";. Vc está repetindo o ID ... Então acho que com o ajuste String sql = "SELECT ID, NOME FROM CATEGORIA"; o erro não acontecerá mais. Podemos testar assim? =)

Boa noite ! mudei e continua o erro. out 08, 2021 8:38:52 PM com.mchange.v2.log.MLog INFORMAÇÕES: MLog clients using java 1.4+ standard logging. out 08, 2021 8:38:53 PM com.mchange.v2.c3p0.C3P0Registry INFORMAÇÕES: Initializing c3p0-0.9.5.4 [built 23-March-2019 23:00:48 -0700; debug? true; trace: 10] out 08, 2021 8:38:53 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource INFORMAÇÕES: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge138akr9mnt4oyir67|5c29bfd, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge138akr9mnt4oyir67|5c29bfd, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost/loja_virtual?useTimezone=true&serverTimezone=UTC, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=**, password=**}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ] Executando a query de listar categoria Exception in thread "main" java.lang.NullPointerException at br.com.alura.jdbc.modelo.Categoria.adicionar(Categoria.java:26) at dao.CategoriaDAO.listarComProdutos(CategoriaDAO.java:62) at TestaListagemDeCategorias.main(TestaListagemDeCategorias.java:17)