Coluna da tabela aparece vazia

Tenho uma tabela que exibe as turmas cadastradas no banco, mas a coluna com o nome dos instrutores fica vazia,
esta é minha classe turma


package autoescola.modelo;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

/**
 *
 * @author Administrador
 */
public class Turma {
    private String nome;
    private Date dataInicio;
    private Instrutor instrutor;
    private int codigo;
    private String vagas;
    private Date dataConclusao;
    private String horario;

    private ArrayList<Aluno> alunos = new ArrayList<Aluno>();

    public Turma() {
        
    }

    public Turma(String nome, String vagas, Date dataInicil, Date dataConclusao, Instrutor instrutor){
        this.setNome(nome);
        this.setVagas(vagas);
        this.setDataInicio(dataInicil);
        this.setDataInicio(dataInicil);
        this.setInstrutor(instrutor);

    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the data
     */
    public Date getDataInicio() {
        return dataInicio;
    }

    /**
     * @param data the data to set
     */
    public void setDataInicio(Date data) {
        this.dataInicio = data;
    }

    /**
     * @return the instrutor
     */
    public Instrutor getInstrutor() {
        return instrutor;
    }

    /**
     * @param instrutor the instrutor to set
     */
    public void setInstrutor(Instrutor instrutor) {
        this.instrutor = instrutor;
    }

    /**
     * @return the codigo
     */
    public int getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    /**
     * @return the vagas
     */
    public String getVagas() {
        return vagas;
    }

    /**
     * @param vagas the vagas to set
     */
    public void setVagas(String vagas) {
        this.vagas = vagas;
    }

    /**
     * @return the alunos
     */
    public ArrayList<Aluno> getAlunos() {
        return alunos;
    }

    /**
     * @param alunos the alunos to set
     */
    public void setAlunos(ArrayList<Aluno> alunos) {
        this.alunos = alunos;
    }

    /**
     * @return the dataConclusao
     */
    public Date getDataConclusao() {
        return dataConclusao;
    }

    /**
     * @param dataConclusao the dataConclusao to set
     */
    public void setDataConclusao(Date dataConclusao) {
        this.dataConclusao = dataConclusao;
    }

    /**
     * @return the horario
     */
    public String getHorario() {
        return horario;
    }

    /**
     * @param horario the horario to set
     */
    public void setHorario(String horario) {
        this.horario = horario;
    }

     public String exibirTurma() {
        return "codigo---" + codigo +
                "\n nome---" + nome +
                "\n Instrutor----" + instrutor+
                "\n Inicil---" + dataInicio +
                "\n Conclusão----" + dataConclusao;
           
    }

      public static String convertDate(String format, Date dtConsulta) {
        try {
            SimpleDateFormat formatter = new SimpleDateFormat(format,
                    new Locale("pt", "BR"));
            return formatter.format(dtConsulta);
        }catch (Exception e) {
            return null;
         }
      }

     public String getDataInicioFormatada(){
         return convertDate("dd/MM/yy", getDataInicio());
     }

     public String getDataConclusaoFormatada(){
         return convertDate("dd/MM/yy", getDataConclusao());
     }

}

E esta é minha tabela

  private void atualizarTabela() {
       
        try {
            ArrayList<Turma> turmas = turmaDAO.buscarTodosTurmas();

            String[] colunas = new String[]{"Turma", "Instrutor", "Início", "Conclusão ", "Código"};
            Object[][] dados = new Object[turmas.size()][5];

            for (int i = 0; i < turmas.size(); i++) {
                Turma turma = turmas.get(i);

                dados[i][0] = turma.getNome();
                dados[i][1] = turma.getInstrutor();
                dados[i][2] = turma.convertDate("dd/MM/yy",turma.getDataInicio() );
                dados[i][3] = turma.convertDate("dd/MM/yy", turma.getDataConclusao());
                dados[i][4] = turma.getCodigo();
            }

            DefaultTableModel dataModel = new DefaultTableModel(dados, colunas);
            TabelaTurma.setModel(dataModel);

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Erro " + ex.getMessage());
        }
    }

  

Se alguém pder me ajudar agradeço, (estou usando o netbeans, e o aplicativo é para desktop)

na sua consulta está retornando os valores certos?
talvez não esteja retornando corretamente do banco.

Esta retornado os valores corretos

tentei acessar um atributo do instrutor

 dados[i][2] = turma.getInstrutor().getNome();

mas da esste erro

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at autoescola.interfaceusuario.ControleDeTurmas.atualizarTabela(ControleDeTurmas.java:66)
at autoescola.interfaceusuario.ControleDeTurmas.TabelaTurmaAncestorAdded(ControleDeTurmas.java:248)

turmaDAO.buscarTodosTurmas()

Já traz os objetos criados (new)??

Abraço!

esse metode é para exibir as turmas que foram criadas

 public ArrayList<Turma> buscarTodosTurmas() throws SQLException {
        Statement smt = conexao.pegarConexao().createStatement();
        String sql = "SELECT * FROM turma";
        ResultSet rsTurma = smt.executeQuery(sql);

        ArrayList<Turma>turmas=new ArrayList<Turma>();
        while(rsTurma.next()){
            Turma turma =criarTurmaAPartirDoResultSet(rsTurma);
            turmas.add(turma);

        }

   return turmas;
     }

Você pode postar a sua tabela turma?

ja postei (atualizarTabela)

Me refiro a sua tabela do banco de dados. Pois é o seguinte:
Provavelmente você possui uma tabela turma e outra chamada instrutores e um relacionamento entre elas.

Além da tabela do banco de dados, pode postar o seu método criarTurmaAPartirDoResultSet(rs)?


 private Turma criarTurmaAPartirDoResultSet(ResultSet rsTurma) throws SQLException {

        Turma turma = new Turma();
        turma.setNome(rsTurma.getString("nome"));
        turma.setCodigo(rsTurma.getInt("codigo"));
        turma.setInstrutor(instrutorDAO.buscar(rsTurma.getInt("instrutor")));
        turma.setDataInicio(rsTurma.getDate("datainicio"));
        turma.setVagas(rsTurma.getString("vaga"));
        turma.setDataConclusao(rsTurma.getDate("dataconclusao"));
      

        return turma;
    }


postar a tabela do banco? Como

A estrutura SQL de criação da tabela. Mas veja se ententi:

Em

turma.setInstrutor(instrutorDAO.buscar(rsTurma.getInt("instrutor")));
  • o valor “instrutor” em rsTurma.getInt(“instrutor”) é o nome da chave estrangeira da tabela turmas referente a tabela instrutores. Certo?
  • o método instrutorDAO.buscar(rsTurma.getInt(“instrutor”)) retorna um objeto do tipo Instrutor. Certo?

Acredito que o problema seja no método instrutorDAO.buscar().

Tente o seguinte:

    private Turma criarTurmaAPartirDoResultSet(ResultSet rsTurma) throws SQLException {  
      
           Turma turma = new Turma();  
           turma.setNome(rsTurma.getString("nome"));  
           turma.setCodigo(rsTurma.getInt("codigo"));  
           turma.setInstrutor(instrutorDAO.buscar(rsTurma.getInt("instrutor")));  
           turma.setDataInicio(rsTurma.getDate("datainicio"));  
           turma.setVagas(rsTurma.getString("vaga"));  
           turma.setDataConclusao(rsTurma.getDate("dataconclusao"));  
     System.out.println("Instrutor: " + turma.getInstrutor().getNome());     
     
          return turma;  
      }  

Continua dando erro

run:
Instrutor: null
Instrutor: null
Instrutor: null
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at autoescola.bancosdedados.TurmaDAO.criarTurmaAPartirDoResultSet(TurmaDAO.java:107)

Olá

Acredito que seja dentro do instrutor, pode ser um erro de intenção, uma vez que vc faz uma conexão do jdbc vc tem que manter ela viva…
No seu caso dentro do metodo buscarInstrutor, vc esta fechando (con.close())… isso faz com que interropa seu script.

acredito que seja isso…

O que vc pode fazer é fazer esse sql do instrutor no proprio metodo, ou criar uma estrutura semelhante ao filter do J2EE.

Editado:
Ou se quer manter assim, fazer que sempre que ele pegue uma conexão, seja uma nova e diferente da que vc usa… uma especie de pool
“thread” de conexões JDBC…

Ok.!?
Espero ter ajudado
Flwss

Voce cadastrou instrutor para a Turma?

Estou inserindo um instrutor na turma, o instrutor ja esta cadastrado no banco

este é o meu botão cadastrar turma


   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
             TurmaDAO turmaDAO = new TurmaDAO();
        Turma turma = new Turma();

        turma.setNome(CampNome.getText());
        turma.setDataInicio(CampDataInicil.getDate());
        turma.setDataConclusao(CampDataConclusao.getDate());
        turma.setInstrutor((Instrutor) Instrutor.getSelectedItem());
        turma.setHorario(CampCargaHoraria.getText());
        turma.setVagas(CampVaga.getText());

        JOptionPane.showMessageDialog(null, "Cadastro feito com sucesso");

        CampNome.setText("");
        Instrutor.setSelectedIndex(-1);
        CampCargaHoraria.setText("");


        try {
            turmaDAO.inserir(turma);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Erro ao criar "+ex.getMessage());
        }
    }                                        

 

Dentro deste “turmaDAO.inserir(turma);” como esta?

public void inserir(Turma turma) throws SQLException {
        String sql = "INSERT INTO turma( nome,instrutor, datainicio, vaga, dataconclusao) values (?,?,?,?,?)";
        PreparedStatement smt = conexao.pegarConexao().prepareStatement(sql);

        smt.setString(1, turma.getNome());
        smt.setInt(2, turma.getInstrutor().getCodigo());
        smt.setDate(3, new Date(turma.getDataInicio().getTime()));
        smt.setString(4, turma.getVagas());
        smt.setDate(5, new Date(turma.getDataInicio().getTime()));
      
        smt.execute();
        smt.close();

    }


ta funcionando corretamete

Depois que voce inserir um instrutor para a turma, não deve mais dar erro.
Ve o retorno desse getSelectedItem. Pode ser que esteja retornando null.

Esta retornando o codigo do instrutor

Ta cadastrando a turma, o problema é na hora de exibir na jTable, onde aparecem todos os campos menos o instrutor, e no banco de dados ta todas as informações certinhas