Null Pointer Exception?

Gostaria que me ajudassem numa questão.
Tenho um DAO que está recuperando informações do banco para montar um objeto.
Porém, quando certa data está vazia, ele não executa o if que compara se o registro está vazio ou não.

if (!rs.getDate("DATA_ENVIO_APROV").equals(null)) 

Aí já cai no catch.
Poderiam me ajudar?
A data no banco está vazia mesmo, mas era pra fazer a validação, né?
Segue código do DAO:

public Solicitacao buscarPorId(long id) throws SQLException {
	Solicitacao solicitacao = null;
	Connection conn = null;
	PreparedStatement pst = null;
	try {
		conn = ConexaoBanco.abrirConexao();
		String sql = "select so.ID_SOLICITACAO, so.TIPO_PEDIDO, so.RESPONSAVEL_PEDIDO, so.DESCRICAO_PEDIDO, "
				+ "so.APROVACAO_PEDIDO, so.LOCAL_CHEGADA, so.STATUS_PEDIDO, so.DATA_INICIAL, "
				+ "so.DATA_ENVIO_APROV, so.DATA_RET_APROV, so.DATA_FINAL, so.PRAZO_LIMITE, so.DATA_FINAL_PREVISTA, "
				+ "se.ID_SETOR, se.DESCRICAO_SETOR, e.ID_ESTOQUE, e.DESCRICAO_ESTOQUE " + "from solicitacao so "
				+ "join setor se on so.SETOR = se.ID_SETOR " + "join estoque e on so.ESTOQUE = e.ID_ESTOQUE "
				+ "where ID_SOLICITACAO like ? " + "order by ID_SOLICITACAO desc";
		pst = conn.prepareStatement(sql);
		pst.setLong(1, id);
		ResultSet rs = pst.executeQuery();

		while (rs.next()) {
			solicitacao = new Solicitacao();
			Setor setor = new Setor();
			Estoque estoque = new Estoque();
			solicitacao.setIdSolicitacao(rs.getLong("ID_SOLICITACAO"));
			solicitacao.setTipoPedido(TipoPedido.convertStringToTipoPedido(rs.getString("TIPO_PEDIDO")));
			solicitacao.setResponsavelPedido(rs.getString("RESPONSAVEL_PEDIDO"));
			setor.setIdSetor(rs.getInt("ID_SETOR"));
			setor.setDescricaoSetor(rs.getString("DESCRICAO_SETOR"));
			solicitacao.setSetor(setor);
			estoque.setIdEstoque(rs.getInt("ID_ESTOQUE"));
			estoque.setDescricaoEstoque(rs.getString("DESCRICAO_ESTOQUE"));
			solicitacao.setEstoque(estoque);
			solicitacao.setDescricaoCompra(rs.getString("DESCRICAO_PEDIDO"));
			solicitacao.setAprovacao(AprovacaoPedido.convertStringToAprovacao(rs.getString("APROVACAO_PEDIDO")));
			solicitacao.setLocalChegada(LocalEntrega.convertStringToLocal(rs.getString("LOCAL_CHEGADA")));
			solicitacao.setStatusSolicitacao(StatusCompra.convertStringToStatus(rs.getString("STATUS_PEDIDO")));
			solicitacao.setDataInicialPedido(ConverteUtil.convertDateToLocal(rs.getDate("DATA_INICIAL")));
			if (!rs.getDate("DATA_ENVIO_APROV").equals(null)) {
				solicitacao.setDataEnvioAprovacao(ConverteUtil.convertDateToLocal(rs.getDate("DATA_ENVIO_APROV")));
			}
			if (!rs.getDate("DATA_RET_APROV").equals(null)) {
				solicitacao.setDataRetornoAprovacao(ConverteUtil.convertDateToLocal(rs.getDate("DATA_RET_APROV")));
			}
			if (!rs.getDate("DATA_FINAL").equals(null)) {
				solicitacao.setDataFinal(ConverteUtil.convertDateToLocal(rs.getDate("DATA_FINAL")));
			}
			solicitacao.setPrazoLimite(ConverteUtil.convertDateToLocal(rs.getDate("PRAZO_LIMITE")));
			solicitacao.setDataFinalPrevista(ConverteUtil.convertDateToLocal(rs.getDate("DATA_FINAL_PREVISTA")));
		}

		pst.close();
		conn.close();

	} catch (Exception e) {

		e.printStackTrace();
		JOptionPane.showMessageDialog(null, e.getMessage());
	} finally {
		pst.close();
		conn.close();
	}
	return solicitacao;
}

@staroski
@TerraSkilll
@Rodrigo_Void

Acredito que tá dando problema porque a data volta vazia, sendo assim deve voltar um objeto nulo, e ao tentar acessar um objeto nulo (o que você está fazendo ao invocar o método Equals dele) dá NullPointer.

Eu recomendo sempre inverter a String e colocar o Literal sempre do lado esquerdo, pode ficar estranho de ler mas evita NullPointers. O Próprio Eclipse faz isso pra você, coloca o cursor em cima da expressão, CTRL+1 e “Invert Equals”.

1 curtida

Para verificar se um objecto é null não deves usar o equals mas sim comparar com ==

if (rs.getDate("DATA_ENVIO_APROV") != null)) {
    solicitacao.setDataEnvioAprovacao(ConverteUtil.convertDateToLocal(rs.getDate("DATA_ENVIO_APROV")));
}
if (rs.getDate("DATA_RET_APROV") != null)) {
    solicitacao.setDataRetornoAprovacao(ConverteUtil.convertDateToLocal(rs.getDate("DATA_RET_APROV")));
}
if (rs.getDate("DATA_FINAL") != null)) {
    solicitacao.setDataFinal(ConverteUtil.convertDateToLocal(rs.getDate("DATA_FINAL")));
}
2 curtidas

Deu certo.
Não sabia que essa verificação se fazia com operadores.
Sabe me informar o motivo, já que meu objeto é uma string?