Null Pointer Exception?

4 respostas Resolvido
nulljdbcjavasqlmysql
F

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;
}

4 Respostas

F

@staroski
@TerraSkilll
@Rodrigo_Void

R

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”.

pmlm
Solucao aceita

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")));
}
F

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

Criado 21 de maio de 2017
Ultima resposta 22 de mai. de 2017
Respostas 4
Participantes 3