Erro de NullPointerException ao pegar dados do banco

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:

[code]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);

}

}

[/code]

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

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

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

[quote=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())”.

[/quote]

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

[quote][code]# public ResultSet ComandoSql(String SQL)

{

try

{

Statement declaracao = conexao.createStatement();

ResultSet resultado = declaracao.executeQuery(SQL); //–> Problema

}

catch(SQLException e)

{

e.printStackTrace();

}

return resultado; [/code][/quote]

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

É,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?

[quote=christo][quote][code]# public ResultSet ComandoSql(String SQL)

{

try

{

Statement declaracao = conexao.createStatement();

ResultSet resultado = declaracao.executeQuery(SQL); //–> Problema

}

catch(SQLException e)

{

e.printStackTrace();

}

return resultado; [/code][/quote]

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
[/quote]

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