Erro ao realizar consultas java.lang.NullPointerException
13 respostas
A
alexandrebpsjc
Boa noite,
Estou tentando fazer a consulta no banco e para isto utilizei a seguinte classe:
importjava.beans.Statement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.SQLSyntaxErrorException;publicclassConexao{Connectionconexao;Stringstatus="";booleanstatusc;publicstaticConnectionConectar(){// base de dados é "test"Stringurl="jdbc:mysql://localhost/mapa";Stringusuario="root";Stringsenha="admin";try{Class.forName("com.mysql.jdbc.Driver").newInstance();Connectionconn=DriverManager.getConnection(url,usuario,senha);System.out.println("Conectou");returnconn;}catch(SQLExceptionex){System.out.println("SQLException: "+ex.getMessage());System.out.println("SQLState: "+ex.getSQLState());System.out.println("VendorError: "+ex.getErrorCode());System.out.println("Não Conectou");returnnull;}catch(Exceptione){System.out.println("Problemas ao tentar conectar com o banco de dados: "+e);returnnull;}}publicStringgetStatus(){returnstatus;}publicConnectiongetConexao(){returnconexao;}publicstaticResultSetqueryMySQL(){java.sql.Statementst;ResultSetrs=null;Stringsql;Connectionconn=null;doublelatitude=0;try{st=conn.createStatement();sql="select latitude from localizacao";rs=st.executeQuery(sql);latitude=rs.getDouble(1);}catch(Exceptionerro){System.out.println(erro+" Não foi possível consultar");}returnrs;}}
Para executar, eu utilizei o seguinte código na classe principal:
publicclassMain{/** * @param args */publicstaticvoidmain(String[]args){// TODO Auto-generated method stubConexao.Conectar();System.out.println(Conexao.queryMySQL());}}
Consigo conectar ao banco, porém não consigo fazer a consulta. O erro que é apresentado é este:
Conectou
java.lang.NullPointerException Não foi possível consultar
Quando executo a querySQL no MySQL retorna o resultado. Não sei se é algo relacionado à permissão, pois criei o usuário como root no MySQL e passei este usuário e sua senha no Eclipse.
catch(Exception e){
e.printStackTrace();
}Ele irá imprimir a linha certa onde esse erro está acontecendo. [=
A
alexandrebpsjc
Imprimiu assim:
java.lang.NullPointerException
at Conexao.queryMySQL(Conexao.java:56)
at Main.main(Main.java:10)
O que significa? A linha 56 é esta:
st= (Statement) conn.createStatement();
V
ViniGodoy
Significa que você está usando uma variável não inicializada. No caso, a variável conn, que vale null. Ela é diferente da variável conexao, criada fora do método.
Opção 1 (melhor):
Retire a linha 08 da classe Main.
Substitua a linha 55 da classe conexão de:
Para:
Opção 2:
Remova a linha 50;
Substitua a linha 55 para:
A
alexandrebpsjc
[quote=ViniGodoy]Significa que você está usando uma variável não inicializada. No caso, a variável conn, que vale null. Ela é diferente da variável conexao, criada fora do método.
Opção 1 (melhor):
Retire a linha 08 da classe Main.
Substitua a linha 55 da classe conexão de:
Para:
Opção 2:
Remova a linha 50;
Substitua a linha 55 para:
Tentei as duas opções, a primeira ele reclamou quando fiz st=Conectar() e pediu para fazer um cast:
st = (Statement) Conectar();
Deu o mesmo erro no log:
java.lang.ClassCastException: com.mysql.jdbc.Connection cannot be cast to java.beans.Statement
at Conexao.queryMySQL(Conexao.java:56)
at Main.main(Main.java:9)
V
ViniGodoy
Note que o erro no log não é o mesmo. O primeiro era um NullPointerException. Esse é um ClassCastException.
Para corrigir, troque esse import:
Para esse:
A
alexandrebpsjc
[quote=ViniGodoy]Note que o erro no log não é o mesmo. O primeiro era um NullPointerException. Esse é um ClassCastException.
Para corrigir, troque esse import:
Para esse:
Fiz a troca e agora apareceu este erro, informando não ser possível converter para o java.sql.Statement, detalhe: dentro do Try ele continuou reclamando a linha
e pediu para fazer o cast: st = (Statement) Conectar();
Conectou
java.lang.ClassCastException: com.mysql.jdbc.Connection cannot be cast to java.sql.Statement
at Conexao.queryMySQL(Conexao.java:54)
at Main.main(Main.java:8)
null
V
ViniGodoy
Posta seu código completo, após as modificações.
E você deve fazer:
A
alexandrebpsjc
Fiz algumas alterações no código, não deixei os métodos como static, veja como ficou:
importjava.sql.Statement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassConexao{Connectionconexao;Stringstatus="";booleanstatusc;Statementst;publicstaticConnectionConectar(){// base de dados é "test"Stringurl="jdbc:mysql://localhost/mapa";Stringusuario="root";Stringsenha="admin";try{Class.forName("com.mysql.jdbc.Driver").newInstance();Connectionconn=DriverManager.getConnection(url,usuario,senha);System.out.println("Conectou");returnconn;}catch(SQLExceptionex){System.out.println("SQLException: "+ex.getMessage());System.out.println("SQLState: "+ex.getSQLState());System.out.println("VendorError: "+ex.getErrorCode());System.out.println("Não Conectou");returnnull;}catch(Exceptione){System.out.println("Problemas ao tentar conectar com o banco de dados: "+e);returnnull;}}publicStringgetStatus(){returnstatus;}publicConnectiongetConexao(){returnconexao;}publicdoublequeryMySQL(){Conectar();ResultSetrs;doublelatitude=0;try{rs=st.executeQuery("SELECT latitude FROM localizacao;");latitude=rs.getDouble(1);System.out.println("Consultou");}catch(Exceptionerro){erro.printStackTrace();}returnlatitude;}}
No caso do método main, como ficaria para acessar? Pois agora que não deixei nada como static, não consigo acessar os métodos da Classe Conexao na Classe main.
Conectou
java.lang.NullPointerException
at Conexao.queryMySQL(Conexao.java:52)
at Main.main(Main.java:10)
V
ViniGodoy
Fica assim:
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassConexao{privateConnectionconectar(){try{Class.forName("com.mysql.jdbc.Driver").newInstance();returnDriverManager.getConnection("jdbc:mysql://localhost/mapa","root","admin");}catch(SQLExceptionex){System.err.println("SQLState: "+ex.getSQLState());System.err.println("VendorError: "+ex.getErrorCode());System.err.println("SQLException: ");ex.printStackTrace();thrownewRuntimeException(ex);}catch(Exceptione){System.err.println("Problemas ao tentar conectar com o banco de dados: ");e.printStackTrace();thrownewRuntimeException(e);}}publicdoublequeryLatitude(){Connectionconn=conectar();PreparedStatementstmt=null;ResultSetrs=null;try{stmt=conn.prepareStatement("SELECT latitude FROM localizacao LIMIT 1;");rs=stmt.executeQuery();if(!rs.next())//Não há latitude a retornarreturn-1;returnrs.getDouble("latitude");}catch(Exceptionerro){thrownewRuntimeException(erro);}finally{//Fecha o statement, o resultset e a conexãoif(rs!=null)try{rs.close();}catch(Exceptione){}if(stmt!=null)try{stmt.close();}catch(Exceptione){}try{conn.close();}catch(Exceptione){}}}publicstaticvoidmain(String[]args){Conexaoconn=newConexao();System.out.println(conn.queryLatitude());}}
A
alexandrebpsjc
Aêeeeeeeeeeee, valeu mano, agora sim deu certo!
A
alexandrebpsjc
Boa noite,
Como eu faço para retornar as outras linhas da tabela? Coloquei este código em um webservice para que retorne a consulta, mas ele retorna sempre o dado da primeira linha, precisaria usar um next ou retornar um array.
O código está assim:
packagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassMain{privateConnectionconectar(){try{Class.forName("com.mysql.jdbc.Driver").newInstance();returnDriverManager.getConnection("jdbc:mysql://localhost/mapa","root","admin");}catch(SQLExceptionex){System.err.println("SQLState: "+ex.getSQLState());System.err.println("VendorError: "+ex.getErrorCode());System.err.println("SQLException: ");ex.printStackTrace();thrownewRuntimeException(ex);}catch(Exceptione){System.err.println("Problemas ao tentar conectar com o banco de dados: ");e.printStackTrace();thrownewRuntimeException(e);}}publicdoublequeryLatitude(){Connectionconn=conectar();PreparedStatementstmt=null;ResultSetrs=null;try{stmt=conn.prepareStatement("SELECT latitude FROM localizacao LIMIT 1;");rs=stmt.executeQuery();if(!rs.next())//NÃo há latitude a retornar return-1;returnrs.getDouble("latitude");}catch(Exceptionerro){thrownewRuntimeException(erro);}finally{//Fecha o statement, o resultset e a conexão if(rs!=null)try{rs.close();}catch(Exceptione){}if(stmt!=null)try{stmt.close();}catch(Exceptione){}try{conn.close();}catch(Exceptione){}}}publicdoublequeryLongitude(){Connectionconn=conectar();PreparedStatementstmt=null;ResultSetrs=null;try{stmt=conn.prepareStatement("SELECT longitude FROM localizacao LIMIT 1;");rs=stmt.executeQuery();if(!rs.next())//Não há longitude a retornar return-1;returnrs.getDouble("longitude");}catch(Exceptionerro){thrownewRuntimeException(erro);}finally{//Fecha o statement, o resultset e a conexão if(rs!=null)try{rs.close();}catch(Exceptione){}if(stmt!=null)try{stmt.close();}catch(Exceptione){}try{conn.close();}catch(Exceptione){}}}}
A
alexandrebpsjc
ViniGodoy:
Fica assim:
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassConexao{privateConnectionconectar(){try{Class.forName("com.mysql.jdbc.Driver").newInstance();returnDriverManager.getConnection("jdbc:mysql://localhost/mapa","root","admin");}catch(SQLExceptionex){System.err.println("SQLState: "+ex.getSQLState());System.err.println("VendorError: "+ex.getErrorCode());System.err.println("SQLException: ");ex.printStackTrace();thrownewRuntimeException(ex);}catch(Exceptione){System.err.println("Problemas ao tentar conectar com o banco de dados: ");e.printStackTrace();thrownewRuntimeException(e);}}publicdoublequeryLatitude(){Connectionconn=conectar();PreparedStatementstmt=null;ResultSetrs=null;try{stmt=conn.prepareStatement("SELECT latitude FROM localizacao LIMIT 1;");rs=stmt.executeQuery();if(!rs.next())//Não há latitude a retornarreturn-1;returnrs.getDouble("latitude");}catch(Exceptionerro){thrownewRuntimeException(erro);}finally{//Fecha o statement, o resultset e a conexãoif(rs!=null)try{rs.close();}catch(Exceptione){}if(stmt!=null)try{stmt.close();}catch(Exceptione){}try{conn.close();}catch(Exceptione){}}}publicstaticvoidmain(String[]args){Conexaoconn=newConexao();System.out.println(conn.queryLatitude());}}
Eu alterei o código para que me retorne uma lista, porém ele me retorna somente duas linhas sendo que estão repetidas, o resultado que ele está trazendo é o da primeira linha, veja o código:
Tenhoumproblemasemelhantequeéoseguinte:-FizumWebServicequefazconsultaaobancodedadoseeleretornaosdadosemumXML,porémelenãoretornatodososdados,eleencontraoprimeiroresultadoetrazeleduasvezes,vejaocódigo:[code]publicListqueryLatitude2(){Connectionconn=conectar();PreparedStatementstmt=null;ResultSetrs=null;List<Double>lista=newArrayList<Double>();try{stmt=conn.prepareStatement("SELECT latitude FROM localizacao;");rs=stmt.executeQuery();while(rs.next()){//NÃohálatitudearetornarDoubled;d=rs.getDouble("latitude");lista.add(d);}returnlista;}catch(Exceptionerro){thrownewRuntimeException(erro);}finally{//Fechaostatement,oresultseteaconexãoif(rs!=null)try{rs.close();}catch(Exceptione){}if(stmt!=null)try{stmt.close();}catch(Exceptione){}try{conn.close();}catch(Exceptione){}}}
[/code]
V
ViniGodoy
Me parece certo, ou só faria assim:
publicList<Double> queryLatitude2() {Connectionconn=conectar();PreparedStatementstmt=null;ResultSetrs=null;List<Double> lista = new ArrayList<Double>();try{
stmt=conn.prepareStatement("SELECT latitude FROM localizacao;");rs=stmt.executeQuery();while(rs.next()){
lista.add(rs.getDouble("latitude"));}
returnlista;}catch(Exceptionerro){
thrownewRuntimeException(erro);}finally{
//Fechaostatement,oresultseteaconexãoif(rs!=null)try{rs.close(); } catch (Exception e) {}if(stmt!=null)try{stmt.close(); } catch (Exception e) {}try{conn.close(); } catch (Exception e) {}}
}