Erro ao cadastrar

Fala galera, boa tarde.
Estou cm a cabeça cheia já, já revirei essa programação de baixo pra cima e vice versa, e não acho o erro dessa “budega”… Rsrsrs…

OBS: O erro não me impede de executar a aplicação…
Ao cadastrar um produto, me retorna um erro em uma determinada linha, mas não estou sabendo lhe dar com isso… Vou colocar a tabela do meu banco, desde a programação da aplicação java, pra vocês me auxiliar.

Tabela no meu banco de dados, onde irei fazer o cadastro:

CREATE TABLE Produto (
    id_produto int (6) NOT NULL AUTO_INCREMENT, 
    id_fornecedorFK int (6) not null, 
    id_categoriaFK int (6) not null, 
    nome_produto varchar(30) not null,                                  
    quantidade int(6) default null,
    valor_entrada varchar(20) default null,
    valor_venda varchar(20) default null,    
    data_entrada date default null,
    primary key (id_produto),
    
    constraint id_fornecedorFK FOREIGN KEY (id_fornecedorFK) REFERENCES Fornecedor (id_fornecedor),
    constraint id_categoriaFK FOREIGN KEY (id_categoriaFK) REFERENCES Categorias (id_categoria)
    );

Parte da minha classe onde eu faço todo o tramite da aplicação (OBS: Coloquei em maiúsculo onde o erro volta, pra se destacar melhor).

String cadastraProduto = "INSERT INTO PRODUTO (ID_FORNECEDORFK, ID_CATEGORIAFK, NOME_PRODUTO, QUANTIDADE, VALOR_ENTRADA, VALOR_VENDA, DATA_ENTRADA) " 
            + " VALUES (?,?,?,?,?,?,?)";

public void cadastrarProduto(ProdutoBean cadastros){
        
        try{
            AcessoMySql2 mysql = new AcessoMySql2();
            
            pstm = mysql.conectar().prepareStatement(cadastraProduto);
           
            pstm.setInt(1, cadastros.getId_fornecedor()); // ERRO SEMPRE VOLTA AQUI !!!
            pstm.setInt(2, cadastros.getId_categoria()); 
            pstm.setString(3, cadastros.getNome_produto());
            pstm.setInt(4, cadastros.getQuantidade()); 
            pstm.setString(5, cadastros.getValor_entrada());
            pstm.setString(6, cadastros.getValor_venda());            
            java.sql.Date d = new java.sql.Date(cadastros.getData_entrada().getTime());
            pstm.setDate(7,d);
            pstm.executeUpdate();
            
            mysql.desconectar();
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }

E por ultimo, meu JFrame, onde pego valores de outras tabelas, digito, e chamo essa função para cadastrar.

 protected void cadastrarProduto() throws ParseException{
        
            ProdutoBean cadastro = new ProdutoBean();
            
 //           DateFormat form = new SimpleDateFormat("dd/MM/yyyy");
            java.util.Date dataEntrada = (java.util.Date) jdcDataEntrada.getDate();
            java.sql.Date dataSql = new java.sql.Date(dataEntrada.getTime());
           cadastro.setId_fornecedor(fornecedor.get(cbFornecedores.getSelectedIndex()).getId_fornecedor());
            cadastro.setId_categoria(categoria.get(cbCategoria.getSelectedIndex()).getId_categoria());
            cadastro.setNome_produto(tfNomeProduto.getText().trim());            
            cadastro.setQuantidade(Integer.parseInt(tfQuantidade.getText().trim()));
            cadastro.setValor_entrada(tfValorEntrada.getText().trim());
            cadastro.setValor_venda(tfValordeVenda.getText().trim());
            cadastro.setData_entrada(dataSql);
                                
            ProdutoControl p = new ProdutoControl();
            p.cadastrarProduto(cadastro);
                  
    
     }

O erro que me retorna é este: java.lang.NullPointerException
at br.com.sisVendas.produto.ProdutoControl.cadastrarProduto(ProdutoControl.java:51)

Linha 51 é a linha que falei ali em cima.
Agradeço a todos que puder me ajudar. Fico no aguardo.

Ou pstm está nulo ou cadastros está nulo.

1 curtida

public class ProdutoControl {

PreparedStatement pstm;
ResultSet rs;

cadastros é de outra classe:

public class ProdutoBean {

public ProdutoBean(){
    
}

private Integer id_produto;
private Integer id_fornecedor;
private String nome_fornecedor;
private Integer id_categoria;
private String nome_categoria;
private String nome_produto;
private Integer quantidade;
private Date data_entrada;
private String valor_entrada;
private String valor_venda;


public Integer getId_produto() {
    return id_produto;
}

public void setId_produto(Integer id_produto) {
    this.id_produto = id_produto;
}

 public Integer getId_fornecedor() {
    return id_fornecedor;
}

public void setId_fornecedor(Integer id_fornecedor) {
    this.id_fornecedor = id_fornecedor;
}

public String getNome_fornecedor() {
    return nome_fornecedor;
}

public void setNome_fornecedor(String nome_fornecedor) {
    this.nome_fornecedor = nome_fornecedor;
}


public Integer getId_categoria() {
    return id_categoria;
}

public void setId_categoria(Integer id_categoria) {
    this.id_categoria = id_categoria;
}

public String getNome_categoria() {
    return nome_categoria;
}

public void setNome_categoria(String nome_categoria) {
    this.nome_categoria = nome_categoria;
}



public String getNome_produto() {
    return nome_produto;
}

public void setNome_produto(String nome_produto) {
    this.nome_produto = nome_produto;
}

public Integer getQuantidade() {
    return quantidade;
}

public void setQuantidade(Integer quantidade) {
    this.quantidade = quantidade;
}

public Date getData_entrada() {
    return data_entrada;
}

public void setData_entrada(Date data_entrada) {
    this.data_entrada = data_entrada;
}

public String getValor_entrada() {
    return valor_entrada;
}

public void setValor_entrada(String valor_entrada) {
    this.valor_entrada = valor_entrada;
}

public String getValor_venda() {
    return valor_venda;
}

public void setValor_venda(String valor_venda) {
    this.valor_venda = valor_venda;
}

O que seria ser nulo ?

Você entende o que é um objeto (instancia de objeto é o nome correto)?
Se sim, entende que isso

Pessoa pes = new Pessoa();

É a declaração

Pessoa pes;

E a instanciação (criação da instância de objeto)

new Pessoa();

Certo? Pode haver variações, como no caso da String:

String palavra = "Teste";

Mas, em suma, é a mesma coisa.

Casos em que um nulo aparece:

Pessoa pes;
//Algumas linhas depois
pes.getNome();//Aqui vai dar nulo, pes não foi instanciada.

Outra possibilidade é você ter um método que retornaria a instância do objeto, como você faz a invocação aqui

Pode ser que tenha ocorrido algo (normalmente, uma exceção) que foi omitida (não foi lançada para quem chamou) e retornou um objeto nulo.
Ou:

Esta chamada recebe um objeto nulo.

Ficou mais claro?

Entendi perfeitamente… No meu caso, o objeto cadastros foi instanciado corretamente… O que não estou entendendo, é que tenho uma outra aplicação parecida, o que muda são os dados que são cadastrados, e não tem erro, portanto, que a inclusão é feita no banco… A aplicação roda sem nenhum problema.

Este meu código que postei aqui, é até uma reutilização…

Mas de qualquer forma, vou ver se acho a solução… Caso conseguir, eu posto aqui.

Como o problema ocorre em uma linha onde existem chamadas a dois métodos de duas instâncias distintas, você pode debugar e identificar qual delas está nula.

Certo… Como eu debugo aquele determinado método ou linha !?

Consegui debugar, realmente, o problema é que o nome da categoria e o nome do fornecedor estão retornando nulos… Vou averiguar agora o porque, depois posto o resultado.

Cara, debugando vi que os dois combobox está recebendo null, mas os outros valores estão normais. Só que não estou entendendo o porque de estar recebendo null, sendo que nos combobox é listado as arraylist normalmente. Ai eu seleciono, digito o resto dos campos e não está gravando devido aos dois não estar pegando os valores. To quebrando a cabeça aqui. Tem como me dar uma mão !?

Não entendi.
Como os combobox estão recebendo null, se eles apresentam os itens para seleção?
O que está acontecendo é que você não está conseguindo pegar os valores dos combobox.
É web ou swing?

Swing.

Exato, o que não estou conseguindo é pegas os valores…

Bom, pelo menos acho que é isso né, pqe antes dele entrar na linha do pstm, ele ja tem que estar com os valores setados prontos para fazer o insert, e neste caso, os únicos valores que estão dando como nulos, são estes que estou pegando pelo combobox… Ja os que eu digito, ja da certo.

É um projeto web ou desktop?

Desktop

Então reveja o trecho onde lê os valores dos JComboBox em questão.
Se quiser, poste aqui, para tentarmos ajudar

public class CadastrarProdutos extends javax.swing.JFrame {

List<ProdutoBean> produto;
List<FornecedoresBean> fornecedor;
List<CategoriaBean> categoria;


public CadastrarProdutos() {
    initComponents();
    listarFornecedores();
    cbFornecedores.setSelectedItem(null);
    listarCategorias();        
    cbCategoria.setSelectedItem(null);
    this.setLocationRelativeTo(null);
}  

 private void listarFornecedores(){        
            FornecedoresControl forn = new FornecedoresControl();        
            fornecedor = forn.listarFornecedores("%%");        
            cbFornecedores.removeAllItems();       
            for (int i = 0; i < fornecedor.size(); i++){                
                cbFornecedores.addItem(fornecedor.get(i).getRazao_social());            
            }
         }

private void listarCategorias(){
    CategoriaControl cat = new CategoriaControl();
    categoria = cat.listarCategoria("%%");
    cbCategoria.removeAllItems();
    for (int i = 0; i < categoria.size(); i++){
        cbCategoria.addItem(categoria.get(i).getNome_categoria());
     }
 }

Coloquei assim pra entender mais ou menos.

Ok, mas qual é a parte do código onde você resgata o valor dos JComboBox?

Ja está ali em cima.

Aqui

O que me parece é que o getid_fornecedor() está retornando nulo.
Afinal, se o retorno do selectedIndex do jcombobox devolve algo e não estoura exceção, o problema é naquele método.