Erro ao buscar atributo Date que no banco de dados está vazio

Olá comunidade, estou desenvolvendo um sistema java com Hibernate e banco de dados PostgreSQL.
Possuo uma classe com dois atributos do tipo Date, o prazoEntrega que deve ser preenchido e o dataInicial que deve ficar em branco até segunda ordem.
O cadastro funciona normalmente, porém na tela de listagem (com uma jTable) estou usando o seguinte código para carregar a tabela:

DefaultTableModel model = (DefaultTableModel) jTable1.getModel(); model.setNumRows(0); List<OrdensFabricacao> ordens = new OrdensFabricacaoDAO().findAll(); SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy"); for (OrdensFabricacao ordem : ordens) { model.addRow(new String[]{ ""+data.format(ordem.getDataInicial()),""+data.format(ordem.getPrazoEntrega()),statusTable,ordem.getPlano().getDescricao() }); }

Ao abrir a tela de listagem e carregar os dados, o Hibernate apresenta o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1106)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:955)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:948)
at java.text.DateFormat.format(DateFormat.java:336)

Inseri uma data direto no banco e listou normalmente, porém o erro ocorre quando está vazio.

Existe alguma forma de verificar um campo do tipo Date está vazio? Porque dai eu poderia fazer um IF e carregar para uma string antes de passar para o model.
Se fosse String era fácil, só usar o equals(""), mas não encontrei como se faz com tipo Date.

Você deve verificar se a data é nula antes de formatar, pois o format não espera nulo.

justamente Wiliamps, a minha dúvida é justamente como verificar se é nulo.

porém encontrei uma forma de resolver meu problema. O velho e bom try catch.

Esta foi a solução que encontrei, porém se alguém conhece alguma “boa prática” por favor compartilhe, pois outras pessoas poderão ser auxiliadas.
Segue abaixo o código.


String datainicial;

DefaultTableModel model = (DefaultTableModel) jTable1.getModel();  
model.setNumRows(0);  
List<OrdensFabricacao> ordens = new OrdensFabricacaoDAO().findAll();  
SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy");  
for (OrdensFabricacao ordem : ordens)  
{
     try
     {
          datainicial = ""+data.format(ordem.getInicio());
     }
     catch(Exception ex)
     {
          datainicial = "";
     }
     model.addRow(new String[]{  
           ""+ordem.getCodigo(), datainicial, ""+data.format(ordem.getPrazoEntrega()),statusTable,ordem.getPlano().getDescricao()
      });  
}  

O correto é você verificar se é nulo mesmo, pois try catch não é recomendado neste caso.


String datainicial = null;

if (ordem.getInicio() != null) {
   datainicial = data.format(ordem.getInicio());
} else {
   datainicial = "";
}  

wiliamps

muito obrigado Wiliamps, sua forma funcionou perfeitamente.

Eu estou acostumado a programar em outras linguagens e banco de dados que tem diferença entre vazio e nulo,
ai achei que pelo fato da coluna da tabela não permitir nulos ele inseria um valor vazio como no SQL Server,
e tivesse que tratar de forma diferente vazios e nulos.

Novamente agradeço pela ajuda.