Null Pointer Exception no preparedStatement

Olá pessoa, estou tendo um problema de null pointer no sistema que estou desenvolvendo usando MVC & DAO, estou tentando fazer um insert no banco de dados fazendo uso de uma chave estrangeira.

porem ao chegar no insert do DAO em pstm.setInt(1, equipamento.getUnidade().getId()); ao tentar pegar o modelo unidade de equipamento getunidade e pegar seu id, a execução para e aponta:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "model.Unidade.getId()" because the return value of "model.Equipamento.getUnidade()" is null

Equipamento.java

package model;

public class Equipamento {
  
  int id;
  Unidade unidade = new Unidade();
  String tipoequip;//OBRIGATORIO
  String tombo;//SE HOUVER
  String serie;//OBRIGATORIO
  String fornecedor;//OBRIGATORIO
  String fabricante;//OBRIGATORIO
  String modelo;//OBRIGATORIO
  String status; //Boolean, ou string?
  String equipamento;//OBRIGATORIO
  String observacao;//NAO
  
  //metodo construtor passando todos campos como obrigatorios
  public Equipamento(
    int id, 
    Unidade unidade,
    String tipoequip,
    String tombo, 
    String serie, 
    String fornecedor, 
    String fabricante, 
    String modelo, 
    String status, 
    String equipamento, 
    String observacao
  ) {
    this.id = id;
    this.unidade = unidade;
    this.tipoequip = tipoequip;
    this.tombo = tombo;
    this.serie = serie;
    this.fornecedor =  fornecedor;
    this.fabricante = fabricante;
    this.modelo = modelo;
    this.status = status;
    this.equipamento = equipamento;
    this.observacao = observacao;
  }
  
  //metodo construtor passando apenas os campos obrigatorios sem o id
  public Equipamento(
    Unidade unidade,
    String tipoequip,
    String tombo, 
    String serie, 
    String fornecedor, 
    String fabricante, 
    String modelo,
    String status, 
    String equipamento, 
    String observacao
  ) {
    this.unidade = unidade;
    this.tipoequip = tipoequip;
    this.tombo = tombo;
    this.serie = serie;
    this.fornecedor =  fornecedor;
    this.fabricante = fabricante;
    this.modelo = modelo;
    this.status = status;
    this.equipamento = equipamento;
    this.observacao = observacao;
  }
  
  //metodo construtor vazio(NÃO APAGUE)
  public Equipamento() {}

  //getters e setters
  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public Unidade getUnidade() {
    return unidade;
  }

  public void setUnidade(Unidade unidade) {
    this.unidade = unidade;
  }    

  public String getTipoequip() {
    return tipoequip;
  }

  public void setTipoequip(String tipoequip) {
    this.tipoequip = tipoequip;
  }

  public String getTombo() {
    return tombo;
  }

  public void setTombo(String tombo) {
    this.tombo = tombo;
  }

  public String getSerie() {
    return serie;
  }

  public void setSerie(String serie) {
    this.serie = serie;
  }

  public String getFornecedor() {
    return fornecedor;
  }

  public void setFornecedor(String fornecedor) {
    this.fornecedor = fornecedor;
  }

  public String getFabricante() {
    return fabricante;
  }

  public void setFabricante(String fabricante) {
    this.fabricante = fabricante;
  }

  public String getModelo() {
    return modelo;
  }

  public void setModelo(String modelo) {
    this.modelo = modelo;
  }

  public String getStatus() {
    return status;
  }

  public void setStatus(String status) {
    this.status = status;
  }

  public String getEquipamento() {
    return equipamento;
  }

  public void setEquipamento(String equipamento) {
    this.equipamento = equipamento;
  }

  public String getObservacao() {
    return observacao;
  }

  public void setObservacao(String observacao) {
    this.observacao = observacao;
  }
}

Unidade.java

package model;

public class Unidade {
  
  int id;
  String unidadenome;
  
  //metodo construtor
  public Unidade(int id, String unidadenome) {
    this.id = id;
    this.unidadenome = unidadenome;
  }
  
  //metodo construtor sem id
  public Unidade(String unidadenome) {
    this.unidadenome = unidadenome;
  }
  
  //metodo construtor vazio
  public Unidade() {}
  
  //getters e setters
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }

  public String getUnidadenome() {
    return unidadenome;
  }

  public void setUnidadenome(String unidadenome) {
    this.unidadenome = unidadenome;
  }

  public String unidadeToString() {
    return getUnidadenome();
  }
  
  public boolean equals(Object objeto) {
    Unidade u = (Unidade) objeto;
    
    if(this.id == u.getId()) {
      return true;
    } else {
      return false;
    }
  }
}

EquipamentoDAO.java

package model.DAO;

import controller.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import model.Equipamento;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import model.Unidade;

public class EquipamentoDAO {
  
  private final Connection conexao;
  
  //metodo construtor
  public EquipamentoDAO(Connection conexao) {
    this.conexao = conexao;
  }
  
  //função para inserir(insert)
  public void inserir(Equipamento equipamento) throws SQLException {
    //string sql
    String sql = "insert into equipamento(unidade,tipoequip,tombo,serie,fornecedor,fabricante,modelo,status,equipamento,observacao)values (?,?,?,?,?,?,?,?,?,?)";
    
    //criamos um statement para executar a query sql
    PreparedStatement pstm = conexao.prepareStatement(sql);
    
    try {
      //antes de executar pstm setString
      pstm.setInt(1, equipamento.getUnidade().getId());
      pstm.setString(2, equipamento.getTipoequip());
      pstm.setString(3, equipamento.getTombo());
      pstm.setString(4, equipamento.getSerie());
      pstm.setString(5, equipamento.getFornecedor());
      pstm.setString(6, equipamento.getFabricante());
      pstm.setString(7, equipamento.getModelo());
      pstm.setString(8, equipamento.getStatus());
      pstm.setString(9, equipamento.getEquipamento());
      pstm.setString(10, equipamento.getObservacao());
      //execute o pstm
      pstm.execute();
    } catch (SQLException ex) {
      JOptionPane.showMessageDialog(null, "Error ao inserir equipamento no banco de dados!" + ex);
    } finally {
      //feche a conexao e o pstm
      conexao.close();
      pstm.close();
    }
  }
}

CadastroEquipamentoController.java

package controller;

import controller.helper.CadastroEquipamentoHelper;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import model.Equipamento;
import view.TelaCadastroEquipamento;
import view.TelaPrincipal;
import java.sql.Connection;
import model.DAO.EquipamentoDAO;
import java.sql.SQLException;
import javax.swing.table.DefaultTableModel;
import model.DAO.UnidadeDAO;
import model.Unidade;

public class CadastroEquipamentoController {
  
  //cria arraylist do tipo Equipamento chamado equipamentos
  ArrayList<Equipamento> equipamentos = new ArrayList<Equipamento>();
  
  //cria variavel do tipo telacadastroequipamento e CadastroEquipamentoHelper e chamando-as de view e helper
  private TelaCadastroEquipamento view;
  private CadastroEquipamentoHelper helper;
  
  //cria variavel tipo TelaPrincipal chamada telaprincipal
  public TelaPrincipal TelaPrincipal;
  
  //metodo construtor
  public CadastroEquipamentoController(TelaCadastroEquipamento view) {
    this.view = view;
    this.helper = new CadastroEquipamentoHelper(view);
  }
  
  //metodo construtor tela principal
  public CadastroEquipamentoController(TelaPrincipal viewprincipal) {
    this.TelaPrincipal  = viewprincipal;
  }
  
  //metodo salvar equipamento
  public void salvarEquipamento() {
    //comparações logicas
    if (view.getTxtUnidade().getSelectedIndex() == 0 && 
      view.getTxtTipoEquip().getText().trim().isEmpty() &&
      view.getTxtTombo().getText().trim().isEmpty() && 
      view.getTxtSerie().getText().trim().isEmpty() && 
      view.getTxtFornecedor().getText().trim().isEmpty() && 
      view.getTxtFabricante().getText().trim().isEmpty() &&
      view.getTxtModelo().getText().trim().isEmpty() && 
      view.getTxtStatus().getSelectedIndex() == 0 && 
      view.getTxtEquipamento().getSelectedIndex() == 0
    ) {
      JOptionPane.showMessageDialog(null, "Campos obrigatorios vazios, preencha-os!!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    } else if (view.getTxtUnidade().getSelectedIndex() == 0 && 
      view.getTxtTombo().getText().trim().isEmpty() &&
      view.getTxtSerie().getText().trim().isEmpty()
    ) {
      JOptionPane.showMessageDialog(null, "Combobox unidade, campos tombo e serie vazios preencha-os!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    } else if (view.getTxtTipoEquip().getText().trim().isEmpty()) {
      JOptionPane.showMessageDialog(null, "Campo tipo equip esta vazio preencha-o!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    } else if (view.getTxtFornecedor().getText().trim().isEmpty()) {
      JOptionPane.showMessageDialog(null, "Campo fornecedor esta vazio preencha-o!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    } else if (view.getTxtFabricante().getText().trim().isEmpty()) {
      JOptionPane.showMessageDialog(null, "Campo fabricante esta vazio preencha-o!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    } else if (view.getTxtModelo().getText().trim().isEmpty()) {
      JOptionPane.showMessageDialog(null, "Campo modelo esta vazio preencha-o!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    } else if (view.getTxtStatus().getSelectedIndex() == 0) {
      JOptionPane.showMessageDialog(null, "Combobox status esta vazio preencha-o!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    } else if (view.getTxtEquipamento().getSelectedIndex() == 0) {
      JOptionPane.showMessageDialog(null, "Campo equipamento esta vazio preencha-o!","ATENÇÃO", JOptionPane.WARNING_MESSAGE);
    }
    
    //compara se todos os campos foram preenchidos
    if (view.getTxtUnidade().getSelectedItem() != null && 
      view.getTxtTipoEquip().getText().length() > 0 && 
      view.getTxtTombo().getText().length() > 0 &&
      view.getTxtSerie().getText().length() > 0 && 
      view.getTxtFornecedor().getText().length() > 0 && 
      view.getTxtFabricante().getText().length() > 0 &&
      view.getTxtModelo().getText().length() > 0 &&
      view.getTxtStatus().getSelectedItem() != null && 
      view.getTxtEquipamento().getSelectedItem() != null && 
      view.getTxtObservacao().getText().trim().isEmpty() || 
      !view.getTxtObservacao().getText().trim().isEmpty()
    ) {
      //pega um equipamento da view
      Equipamento equipamento = helper.obterModeloSemID();
      
      try {
        //cria objeto do tipo connection conexao passando novo Conexao(conexao.java) chamando metodo conectar
        Connection conexao = new Conexao().Conectar();
        
        //cria objeto do tipo EquipamentoDAO chamado equipamentoDAO passando novo EquipamentoDAO recebendo conexao
        EquipamentoDAO equipamentoDAO = new EquipamentoDAO(conexao);
        
        //arraylist do tipo equipamento chamado equipamentos recebe equipamentoDAO.selecioneallequipamento
        equipamentoDAO.inserir(equipamento);
        
        //helper chama o metodo bloquear campos
        helper.bloquearCampos();
        
        //helper chama metodo limpar tela(Campos)
        helper.limparTela();
        
        //chama tabela equipamentos;
        tabelaEquipamentos();
        
        JOptionPane.showMessageDialog(null, "Equipamento inserido com sucesso!");
        
        //pegue exceção sql
      } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Error ao inserir equipamento no banco de dados! /nError:"+ex);
      }
    }
  }

  //metodo tabelaEquipamentos
  public void tabelaEquipamentos() {
    //se a view a tabela for diferente de nulo
    if (view.jTabelaCadEquip != null) {
      //modelo do tipo defaultablemodel recebe convertendo para defaulttablemodel a view passando a tabela e pegando seu modelo
      DefaultTableModel modelo = (DefaultTableModel) view.jTabelaCadEquip.getModel();
      
      //se as linhas do modelo for maior que zero
      if (modelo.getRowCount() > 0) {
        //sete as linhas como 0
        modelo.setRowCount(0);
      }
      
      try {
        //cria objeto do tipo connection conexao passando novo Conexao(conexao.java) chamando metodo conectar
        Connection conexao = new Conexao().Conectar();
        
        //cria objeto do tipo EquipamentoDAO chamado equipamentoDAO passando novo EquipamentoDAO recebendo conexao
        EquipamentoDAO equipamentoDAO = new EquipamentoDAO(conexao);
        
        //logins do tipo arraylist do tipo Equipamento recebe equipamentoDAO chamando metodo selecione todos equipamentos
        ArrayList<Equipamento> equipamentos = equipamentoDAO.selecioneAllEquipamento();
        
        //para cada equipamento no arraylist equipamentos
        for (Equipamento equipamento : equipamentos) {
          //quantidade de linhas que o objeto vai ter
          Object[] linha = new Object[11];
          
          //pegue as respectivas linhas de cada equipamento e as sete
          linha[0] = equipamento.getId();
          linha[1] = equipamento.getUnidade().getUnidadenome();
          linha[2] = equipamento.getTipoequip();
          linha[3] = equipamento.getTombo();
          linha[4] = equipamento.getSerie();
          linha[5] = equipamento.getFornecedor();
          linha[6] = equipamento.getFabricante();
          linha[7] = equipamento.getModelo();
          linha[8] = equipamento.getStatus();
          linha[9] = equipamento.getEquipamento();
          linha[10] = equipamento.getObservacao();
          
          //adicione as linhas ao modelo
          modelo.addRow(linha);
        }
      } catch(SQLException ex) {
        JOptionPane.showMessageDialog(null, "Error ao preencher tabela!" + ex);
      }
    }
  }
  
  public void atualizaUnidade() {
    try {
      //buscar unidade no banco de dados
      
      //cria objeto do tipo connection conexao passando novo Conexao(conexao.java) chamando metodo conectar
      Connection conexao = new Conexao().Conectar();  
      
      //cria objeto do tipo UnidadeDAO unidadedao passando UnidadeDAO recebendo conexao
      UnidadeDAO unidadedao = new UnidadeDAO(conexao);
      
      //cria arraylist de unidade chamado unidades passando o objeto unidadedao do tipo Unidade chamando o metodo selecioneAllUnidade
      ArrayList<Unidade> unidades = unidadedao.selecioneAllUnidade();
      
      //exibir login nome no combobox nome
      helper.preencherUnidade(unidades);
    } catch(SQLException ex) {
      JOptionPane.showMessageDialog(null,"Error a preencher combobox unidade:" +ex);
    }
  }
}

CadastroEquipamentoHelper.java

package controller.helper;

import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import model.Equipamento;
import model.Unidade;
import view.TelaCadastroEquipamento;

public class CadastroEquipamentoHelper {
  
  private final TelaCadastroEquipamento view;
  
  //metodo construtor
  public CadastroEquipamentoHelper(TelaCadastroEquipamento view) {
    this.view = view;
  }
  
  //metodo obter modelo sem id apenas para a inserção dos campos mais importantes
  public Equipamento obterModeloSemID() {
    Unidade unidade = obterUnidade();//Unidade unidade recebe metodo obter unidade neste helper
    String tipoequip = view.getTxtTipoEquip().getText();//String tipoequip recebe view pegue o getTextUnidade e pegue o texto
    String tombo = view.getTxtTombo().getText();//String tombo recebe view pegue o getTxtTombo e pegue o texto
    String serie = view.getTxtSerie().getText();//String serie recebe view pegue o getTxtSerie e pegue o texto
    String fornecedor = view.getTxtFornecedor().getText();//String fornecedor recebe view pegue o getTxtFornecedor e pegue o texto
    String fabricante = view.getTxtFabricante().getText();//String fabricante recebe view pegue o get TxtFabricante e pegue o texto
    String modelo = view.getTxtModelo().getText();//String modelo recebe view pegue o getTxtmodelo e pegue o texto
    String status = view.getTxtStatus().getSelectedItem().toString();//String status recebe view pegue o getselecteditem para string
    String equipamentouni = view.getTxtEquipamento().getSelectedItem().toString();//String equipamentouni recebe view pegue o getselected item para string
    String observacao = view.getTxtObservacao().getText();//String observacao recebe view pegue o getTextObservacao e pegue o texto
    
    //construir objeto do tipo equipamento
    Equipamento equipamento = new Equipamento(unidade, tipoequip, tombo, serie, fornecedor, fabricante, modelo, status, equipamentouni, observacao);
    return equipamento;
  }
  
  //metodo obter modelo com todos os campos
  public Equipamento obterModelo() {
    Integer id = Integer.parseInt(view.getTxtId().getText());
    Unidade unidade = obterUnidade();//Unidade unidade recebe metodo obter unidade neste helper
    String tipoequip = view.getTxtTipoEquip().getText();//String tipoequip recebe view pegue o getTextUnidade e pegue o texto
    String tombo = view.getTxtTombo().getText();//String tombo recebe view pegue o getTxtTombo e pegue o texto
    String serie = view.getTxtSerie().getText();//String serie recebe view pegue o getTxtSerie e pegue o texto
    String fornecedor = view.getTxtFornecedor().getText();//String fornecedor recebe view pegue o getTxtFornecedor e pegue o texto
    String fabricante = view.getTxtFabricante().getText();//String fabricante recebe view pegue o get TxtFabricante e pegue o texto
    String modelo = view.getTxtModelo().getText();//String modelo recebe view pegue o getTxtmodelo e pegue o texto
    String status = view.getTxtStatus().getSelectedItem().toString();//String status recebe view pegue o getselecteditem para string
    String equipamentouni = view.getTxtEquipamento().getSelectedItem().toString();//String equipamentouni recebe view pegue o getselected item para string
    String observacao = view.getTxtObservacao().getText();//String observacao recebe view pegue o getTextObservacao e pegue o texto

    //construir objeto do tipo equipamento
    Equipamento equipamento = new Equipamento(id, unidade, tipoequip, tombo, serie, fornecedor, fabricante, modelo, status, equipamentouni, observacao);
    return equipamento;
  }
  
  //metodo para setar modelo
  public void setModelo() {
    int setar = view.jTabelaCadEquip.getSelectedRow();

    view.txtId.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 0).toString());
    view.txtUnidade.setSelectedItem(view.jTabelaCadEquip.getModel().getValueAt(setar, 1).toString());
    view.txtTipoEquip.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 2).toString());
    view.txtTombo.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 3).toString());
    view.txtSerie.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 4).toString());
    view.txtFornecedor.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 5).toString());
    view.txtFabricante.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 6).toString());
    view.txtModelo.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 7).toString());
    view.txtStatus.setSelectedItem(view.jTabelaCadEquip.getModel().getValueAt(setar, 8).toString());
    view.txtEquipamento.setSelectedItem(view.jTabelaCadEquip.getModel().getValueAt(setar, 9).toString());
    view.txtObservacao.setText(view.jTabelaCadEquip.getModel().getValueAt(setar, 10).toString());
  }
  
  //metodo para limpar os campos
  public void limparTela() {
    view.getTxtUnidade().removeAllItems();
    view.getTxtTipoEquip().setText("");
    view.getTxtTombo().setText("");
    view.getTxtSerie().setText("");
    view.getTxtFornecedor().setText("");
    view.getTxtFabricante().setText("");
    view.getTxtModelo().setText("");
    view.getTxtStatus().removeAllItems();
    view.getTxtEquipamento().removeAllItems();
    view.getTxtObservacao().setText("");
    view.getjTabelaCadEquip().clearSelection();
  }
  
  //metodo para bloquear os campos
  public void bloquearCampos() {
    view.getTxtUnidade().setEnabled(false);
    view.getTxtTipoEquip().setEnabled(false);
    view.getTxtTombo().setEnabled(false);
    view.getTxtSerie().setEnabled(false);
    view.getTxtFornecedor().setEnabled(false);
    view.getTxtFabricante().setEnabled(false);
    view.getTxtModelo().setEnabled(false);
    view.getTxtStatus().setEnabled(false);
    view.getTxtEquipamento().setEnabled(false);
    view.getTxtObservacao().setEnabled(false);

    view.btnEditar.setEnabled(false);
    view.btnSalvar.setEnabled(false);
    view.btnExcluir.setEnabled(true);
    view.btnPesquisar.setEnabled(false);
  }
  
  //metodo para desbloquear campos
  public void desbloquearCampos() {
    view.getTxtUnidade().setEnabled(true);
    view.getTxtTipoEquip().setEnabled(true);
    view.getTxtTombo().setEnabled(true);
    view.getTxtSerie().setEnabled(true);
    view.getTxtFornecedor().setEnabled(true);
    view.getTxtFabricante().setEnabled(true);
    view.getTxtModelo().setEnabled(true);
    view.getTxtStatus().setEnabled(true);
    view.getTxtEquipamento().setEnabled(true);
    view.getTxtObservacao().setEnabled(true);
    
    view.btnEditar.setEnabled(true);
    view.btnExcluir.setEnabled(true);
    view.btnSalvar.setEnabled(true);
    view.btnPesquisar.setEnabled(true);
  }
  
  public Unidade obterUnidade() {
    view.getTxtUnidade().removeAllItems();
    return (Unidade) view.getTxtUnidade().getSelectedItem();
  }
  
  public void preencherUnidade(ArrayList<Unidade> unidades) {
    view.getTxtUnidade().removeAllItems();
    DefaultComboBoxModel combomodel = (DefaultComboBoxModel) view.getTxtUnidade().getModel();
    
    for(Unidade unidade : unidades) {
      combomodel.addElement(unidade.unidadeToString());
    }
  }
}

Abreviei parte do codigo para não ficar muito extenso:
Projeto no github:GitHub - YUSEIRENDER/SemurrCEI

Qual valor está sendo retornado nesse método?

public Unidade obterUnidade() {
  view.getTxtUnidade().removeAllItems();
  return (Unidade) view.getTxtUnidade().getSelectedItem();
}

removi o remove all itens desse metodo e passou a dar

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: class java.lang.String cannot be cast to class model.Unidade (java.lang.String is in module java.base of loader ‘bootstrap’; model.Unidade is in unnamed module of loader ‘app’)

Esse erro é pq vc está montando o model da combobox com uma string, nessa parte:

combomodel.addElement(unidade.unidadeToString());

Basicamente, vc está guardando string no model e tentando pegar como se fosse um objeto Unidade.