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

Porque está ocorrendo a NullPointerException?

public class Produto { private String codpro; private String despro; private String tippro;

public Produto(String codPro, String desPro, String tipPro) {
    super();
    this.codpro = codPro;
    this.despro = desPro;
    this.tippro = tipPro;
}

public String getCodpro() {
    return codpro;
}

public void setCodpro(String codpro) {
    this.codpro = codpro;
}

public String getDespro() {
    return despro;
}

public String getTippro() {
    return tippro;
}

@Override
public String toString() {
    return String.format("O produto inserido foi: %s, %s, %s ", this.codpro, this.despro, this.tippro);
}

}

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestaInsertComProduto {

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

        Produto livro = new Produto("21417", "INSERÇÃO DE LIVRO TESTE", "C");

        try (Connection connection = new ConnectionFactory().recuperarConexao()) {

            String cmdSql = ("INSERT INTO PRODUTOS(CODPRO, DESPRO, TIPPRO) VALUES (?, ?, ?)");


            try (PreparedStatement pstm = connection.prepareStatement(cmdSql, Statement.NO_GENERATED_KEYS)) {
                pstm.setString(1, livro.getCodpro());
                pstm.setString(2, livro.getDespro());
                pstm.setString(3, livro.getTippro());

                pstm.execute();

                try (ResultSet rst = pstm.getResultSet()) {    
                    while(rst.next()) {
                        livro.setCodpro(rst.getString("CODPRO"));
                    }
                }
            }
        }
        System.out.println(livro);
    }
}

Exception in thread "main" java.lang.NullPointerException at TestaInsertComProduto.main(TestaInsertComProduto.java:26)

5 respostas

Oi MARCELO

Está dando nullpointer na linha abaixo pois o "rst" está null.:

while(rst.next()) {

O insert deveria ser em PRODUTO ao invés de PRODUTOS.

Fora isso, posta o stack completo do erro, acredito que tenha algo a mais além do NullPointerException .

Oi Otávio,

Obrigado pelo retorno,

Criei a minha tabela como produtos mesmo, e estou usando um banco de dados SQL Server, que eu já tinha instalado na minha máquina.

Observei que mesmo retornando NullPointerExcepcion, o registro está sendo gravado.

SELECT * FROM PRODUTOS WHERE CODPRO = '21417'
codpro         despro                                                                                               tippro
-------------- ---------------------------------------------------------------------------------------------------- ------
21417          INSERÇÃO DE LIVRO TESTE                                                                              C

Abaixo segue a mensagem completa.

jun 09, 2020 9:29:47 AM com.mchange.v2.log.MLog 
INFORMAÇÕES: MLog clients using java 1.4+ standard logging.
jun 09, 2020 9:29:48 AM 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]
jun 09, 2020 9:29:48 AM 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 -> 1hge0w6aa16guqu52t636f|4b85612c, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge0w6aa16guqu52t636f|4b85612c, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:sqlserver://localhost:1433;instanceName=MSSQLSERVER;dataBaseName=VAHLE_SAPIENS, 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 ]
Exception in thread "main" java.lang.NullPointerException
    at br.com.alura.jdbc.dao.ProdutoDAO.salvar(ProdutoDAO.java:29)
    at br.com.alura.jdbc.TestaInsertComProduto.main(TestaInsertComProduto.java:15)

Boa tarde!

Poderia compartilhar a classe ProdutoDAO.java, pelo menos até a linha 29, que é onde está dando o erro?

Olá,

Dando sequencia no curso ela está um pouco diferente do que estava, agora o erro ocorre na linha 32.

package br.com.alura.jdbc.dao;

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

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

public class ProdutoDAO {
    private Connection connection;

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


    public void salvar(Produto produto) throws SQLException, NullPointerException {
        String cmdSql = ("INSERT INTO PRODUTOS (CODPRO, DESPRO, TIPPRO) VALUES (?, ?, ?)");

        try (PreparedStatement pstm = connection.prepareStatement(cmdSql, Statement.NO_GENERATED_KEYS)) {
            pstm.setString(1, produto.getCodpro());
            pstm.setString(2, produto.getDespro());
            pstm.setString(3, produto.getTippro());

            pstm.execute();

            try (ResultSet rst = pstm.getResultSet()) {
                while (rst.next()) {
                    produto.setCodpro(rst.getString("CODPRO"));
                }
            } 
            // Se colocar esse catch não ocorre o erro
            //catch (NullPointerException ex) {
            //    ex.getStackTrace();
            //}
        }
        System.out.println(produto);
    }

    public List<Produto> listar() throws SQLException {
        List<Produto> produtos = new ArrayList<>();
        String cmdSql = "SELECT CODPRO, DESPRO,TIPPRO FROM PRODUTOS";

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

            try(ResultSet rst = pstm.getResultSet()){
                while (rst.next()) {
                    Produto produto = new Produto(rst.getString(1), rst.getString(2), rst.getString(3));
                    produtos.add(produto);
                }
            }
        }
        return produtos;
    }
}

jun 09, 2020 4:46:32 PM com.mchange.v2.log.MLog INFORMAÇÕES: MLog clients using java 1.4+ standard logging. jun 09, 2020 4:46:33 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] jun 09, 2020 4:46:33 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 -> 1bqqqwuaa16wgexst9eau6|4b85612c, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1bqqqwuaa16wgexst9eau6|4b85612c, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:sqlserver://localhost:1433;instanceName=MSSQLSERVER;dataBaseName=VAHLE_SAPIENS, 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 ] Exception in thread "main" java.lang.NullPointerException at br.com.alura.jdbc.dao.ProdutoDAO.salvar(ProdutoDAO.java:32) at br.com.alura.jdbc.TestaInsertEListagemComProduto.main(TestaInsertEListagemComProduto.java:19)


`

solução!

Boa tarde!

Entendo que na sua função de inserir, este trecho esta sobrando:

try (ResultSet rst = pstm.getResultSet()) {
        while (rst.next()) {
           produto.setCodpro(rst.getString("CODPRO"));
      }
} 

Logo após você fazer o insert, em pstm.execute(); , você segue para uma consulta. Mas o seu pstm está configurado para executar um Insert, não um Select.

Aí seu rst fica null, gerando o erro. Retire o trecho que eu falei, e execute novamente o teste por favor.

Bons estudos!!

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