Erro de NullPointerException ao pegar dados do banco

6 respostas
evrocha

Olá pessoal.Bom,está acontecendo um erro aqui que não estou entendendo.Fiz a classe ConectarPostgres aonde tem os métodos conecta,fechaconexao,comandosql e pegadadosselect.Fiz também uma classe Main para verificar se os métodos estão corretos,mas quando executo o método main desta classe main,obtenho erro de NullPointerException.

Aqui está a classe ConectarPostgres

import java.sql.*;

   public class ConectarPostgres 
   {
   
      	Connection conexao; 
		Statement declaracao;
		ResultSet resultado;

		
        
		public void Conecta()
     	{
      		try
      		{
         		 
         
	    		
		   		try
		   		{   
		   		
			   			Class.forName("org.postgresql.Driver").newInstance();
  	  	   		}
  	  	   		catch(Exception e)
  	  	   		{
	  	  	   		
	  	  	   		System.out.println("falha ao carregar o driver de conexao ao banco de dados");
	  	  	   		
	  	  	   	}
          		
          		conexao = DriverManager.getConnection("jdbc:postgresql://192.168.0.2:5432/postgres","postgres","postgres");
		  	}
		  	catch(Exception e)
		  	{
			  
			  		System.out.print("Falha ao carregar a conexão");
			  		
		 	}
	 	}
	 	public ResultSet ComandoSql(String SQL)
	 	{	 
		 	try
		 	{	
          			
          			Statement declaracao = conexao.createStatement(); 
   
          			
          			ResultSet resultado = declaracao.executeQuery(SQL);
   					
          			
      		}		
          	catch(SQLException e)
          	{
	          	
	          	e.printStackTrace();
	        		  	
	        }
	        return resultado;
          	

      	}
      	public void FechaConexao()
      	{
	      	
	      	try
         	{
            	conexao.close();
         	}
         	catch(SQLException onConClose)
         	{
             	System.out.println("Houve erro no fechamento da conexão");
             	onConClose.printStackTrace();
         	}
	      	
	    
	    }
	    public void PegaDadosSelect(ResultSet resultado)
	    {


			try
			{
				while(resultado.next())
				{
					
					System.out.println(resultado.getString("nome"));
					
		    	}
			}
			catch(SQLException e)
			{
		
					System.out.println("houve um erro ao trazer os dados do banco");
					
			}
		}

     }

e aqui a classe Main:

import java.sql.*;

public class Main 
{


	public static ConectarPostgres conexao = new ConectarPostgres();
	public static ResultSet resultado;

	public static void main(String[] args) 
	{

		conexao.Conecta();
		resultado = conexao.ComandoSql("select nome from pessoas pessoasid < 30");
		conexao.PegaDadosSelect(resultado);

	}

}

O erro de NullPointerException ocorre quando dou o comando "conexao.PegaDadosSelect(resultado);".O que está errado?

6 Respostas

Cabazzo

Joga a mensagem de erro toda na tela pra getne ter uma idéia.

evrocha

A mensagem de erro é só esta:“Exception in thread “main” java.lang.NullPointerException
at ConectarPostgres.PegaDadosSelect(ConectarPostgres.java:93)
at Main.main(Main.java:17)

Sendo a linha 17 da main,a linha aonde tem o comando “conexao.PegaDadosSelect(resultado);” e a linha 93 da ConectarPostgres,a linha que tem o comando “while(resultado.next())”.

newj

evrocha:
A mensagem de erro é só esta:“Exception in thread “main” java.lang.NullPointerException
at ConectarPostgres.PegaDadosSelect(ConectarPostgres.java:93)
at Main.main(Main.java:17)

Sendo a linha 17 da main,a linha aonde tem o comando “conexao.PegaDadosSelect(resultado);” e a linha 93 da ConectarPostgres,a linha que tem o comando “while(resultado.next())”.

Provavelmente está dando erro pq resultado está com valor Null. Vi teu código e está faltando um where na tua query:

“select nome from pessoas where pessoasid < 30”

Veja se funcionou agora ok!

Abraço

christo
# public ResultSet ComandoSql(String SQL)  
#         {      
#             try  
#             {     
#                       
#                     Statement declaracao = conexao.createStatement();   
#      
#                       
#                     ResultSet resultado = declaracao.executeQuery(SQL);  //--> Problema
#                       
#                       
#             }         
#             catch(SQLException e)  
#             {  
#                   
#                 e.printStackTrace();  
#                           
#             }  
#             return resultado;
O problema está na procedure ComandoSql, pois você está declarando a varíavel resultado dentro do try catch, sendo que assim ela fica fora do escopo no comando "return resultado". Como você já declarou esta variável no início da classe, basta remover a palavra ResultSet, assim:
resultado = declaracao.executeQuery(SQL);

Abrs,

Christovam

evrocha

É,tinha esquecido do where ali.Mas mesmo colocando o where o mesmo problema persiste.

O que eu não entendo é que se eu colocar o método ComandoSql desta forma:

import java.sql.*;

   public class ConectarPostgres 
   {
   
      	Connection conexao; 
		Statement declaracao;
		ResultSet resultado;

		
        
		public void Conecta()
     	{
      		try
      		{
         		 
         
	    		
		   		try
		   		{   
		   		
			   			Class.forName("org.postgresql.Driver").newInstance();
  	  	   		}
  	  	   		catch(Exception e)
  	  	   		{
	  	  	   		
	  	  	   		System.out.println("falha ao carregar o driver de conexao ao banco de dados");
	  	  	   		
	  	  	   	}
          		
          		conexao = DriverManager.getConnection("jdbc:postgresql://192.168.0.2:5432/postgres","postgres","postgres");
		  	}
		  	catch(Exception e)
		  	{
			  
			  		System.out.print("Falha ao carregar a conexão");
			  		
		 	}
	 	}
	 	public ResultSet ComandoSql(String SQL)
	 	{	 
		 	try
		 	{	
          			
          			Statement declaracao = conexao.createStatement(); 
   
          			
          			ResultSet resultado = declaracao.executeQuery(SQL);
   					
          			
      		}		
          	catch(SQLException e)
          	{
	          	
	          	e.printStackTrace();
	        		  	
	        }
                try
		{
			 while(resultado.next())
			 {
					
				 System.out.println(resultado.getString("nome"));
					
		    	  }
			}
		catch(SQLException e)
		{
		
			 System.out.println("houve um erro ao trazer os dados do banco");
					
		}
	        return resultado;
          	

      	}
      	public void FechaConexao()
      	{
	      	
	      	try
         	{
            	conexao.close();
         	}
         	catch(SQLException onConClose)
         	{
             	System.out.println("Houve erro no fechamento da conexão");
             	onConClose.printStackTrace();
         	}
	      	
	    
	    }
	   

     }

Os resultados da consulta SQL aparecem no console e não ocorre nenhum erro.

O que deve está errado é naquele return resultado que não deve está retornando o resultado.hehe.
Não estou entendendo o que pode está errado.Quando eu dou aquele “return resultado” no método ComandoSql,a variável “resultado” do método main era para estar com aquele valor,certo?

evrocha
christo:
# public ResultSet ComandoSql(String SQL)  
#         {      
#             try  
#             {     
#                       
#                     Statement declaracao = conexao.createStatement();   
#      
#                       
#                     ResultSet resultado = declaracao.executeQuery(SQL);  //--> Problema
#                       
#                       
#             }         
#             catch(SQLException e)  
#             {  
#                   
#                 e.printStackTrace();  
#                           
#             }  
#             return resultado;
O problema está na procedure ComandoSql, pois você está declarando a varíavel resultado dentro do try catch, sendo que assim ela fica fora do escopo no comando "return resultado". Como você já declarou esta variável no início da classe, basta remover a palavra ResultSet, assim:
resultado = declaracao.executeQuery(SQL);

Abrs,

Christovam

Ok.Valeu.Funcionou.Erro bobo meu mesmo.hehe

Criado 9 de julho de 2008
Ultima resposta 9 de jul. de 2008
Respostas 6
Participantes 4