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