Null Pointer em um select através de JPA

1 resposta
guisantogui

Bom dia pessoas, estou começando com JPA, e tentei fazer um estoque para começar, consegui inserir e deletar perfeitamente, mas quando tento pesquisar um registro ele não encontra, mesmo estando com o ID correto!

Fonte que busca da tabela:
@Override
	public Produto getProduto(int id) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory(databaseName);
		EntityManager em = emf.createEntityManager();
		EntityTransaction transaction = em.getTransaction();
		Produto prod = null;
		
		try{
			transaction.begin();
			prod = em.find(Produto.class, id);
			transaction.commit();
		}
		catch(Exception e){
			return null;
		}
		finally{
			em.close();
			emf.close();
		}
		return prod;
	}
Main class:
public class Main {

	public static void main(String[] args) {
		GerenciaProduto gp = new GerenciaProduto();
	//	Produto p = new Produto("broca", "produto em aço", 200);

		//gp.adicionaProduto(p);
		//gp.removeProduto(1);
		Produto newp = gp.getProduto(4);
		System.out.println(newp);
		
		System.out.println(newp.toString());
		
	}
}

1 Resposta

Adriano_Almeida

Oi Gui, como vai?

Nesse código que você mostrou, não ficou claro onde está acontecendo a NPE. Sabe nos apontar onde é?

Outra coisa, uma dica na verdade, é que você pode ter problemas tratando a exceção daquela forma no seu método getProduto. Isso porque, quando há uma exceção, você retorna null, e lá na frente, quando a execução do código continuar, você tomará uma NullPointerException, pois você invoca métodos nesse produto que deveria ter sido retornado. O problema é… e se no meio do caminho a transação falhou? Você continuará recebendo a NPE lá na frente e vai ficar perdido, sem saber que a transação falhou. A gente costuma chamar isso de “engolir” a exceção original.

Uma alternativa, minha preferida no caso, é você nem tratar a exceção dentro do getProduto. Deixe-a acontecer, assim, se acontecer a exceção, o seu main irá falhar mostrando o que efetivamente aconteceu.

Abraço

Criado 23 de setembro de 2012
Ultima resposta 23 de set. de 2012
Respostas 1
Participantes 2