Erro ao realizar consultas java.lang.NullPointerException

13 respostas
A

Boa noite,

Estou tentando fazer a consulta no banco e para isto utilizei a seguinte classe:

import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLSyntaxErrorException;


public class Conexao {
	   Connection conexao;
	   String status="";
	   boolean statusc;
	   public static Connection Conectar(){
		// base de dados é "test"
		    String url = "jdbc:mysql://localhost/mapa";
		    String usuario = "root";
		    String senha = "admin";

		    try{
		      Class.forName("com.mysql.jdbc.Driver").newInstance();
		      Connection conn = DriverManager.getConnection(url, usuario,
		         senha);
		      System.out.println("Conectou");
		      return conn;
		    }
		    catch(SQLException ex){
		      System.out.println("SQLException: " + ex.getMessage());
		      System.out.println("SQLState: " + ex.getSQLState());
		      System.out.println("VendorError: " + ex.getErrorCode());
		      System.out.println("Não Conectou");
		      return null;
		    }
		    catch(Exception e){
		      System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
		      return null;
		    }
		  }
	   public String getStatus(){
	       return status;
	   }
	   public Connection getConexao(){
	       return conexao;
	   }
	   
  
public static ResultSet queryMySQL(){
	    java.sql.Statement st;
	    ResultSet rs=null;
	    String sql;
	    Connection conn = null;
	    double latitude=0;
	   

      try{
          st= conn.createStatement();
          sql="select latitude from localizacao";
          rs=st.executeQuery(sql);
          latitude=rs.getDouble(1);
      } catch (Exception erro){
         System.out.println(erro+" Não foi possível consultar");
      }
      return rs;
  }

}

Para executar, eu utilizei o seguinte código na classe principal:

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Conexao.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.

Alguém pode me ajudar?

13 Respostas

H

No seu try catch coloque assim:

catch(Exception e){ e.printStackTrace(); }Ele irá imprimir a linha certa onde esse erro está acontecendo. [=

A

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

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:

  1. Remova a linha 50;
  2. Substitua a linha 55 para:
A

[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:

  1. Remova a linha 50;
  2. 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

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

[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

Posta seu código completo, após as modificações.

E você deve fazer:

A

Fiz algumas alterações no código, não deixei os métodos como static, veja como ficou:

import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Conexao {
	   Connection conexao;
	   String status="";
	   boolean statusc;
	   Statement st;
	    
	   public static Connection Conectar(){
		// base de dados é "test"
		    String url = "jdbc:mysql://localhost/mapa";
		    String usuario = "root";
		    String senha = "admin";

		    try{
		      Class.forName("com.mysql.jdbc.Driver").newInstance();
		      Connection conn = DriverManager.getConnection(url, usuario,
		         senha);
		      System.out.println("Conectou");
		      return conn;
		    }
		    catch(SQLException ex){
		      System.out.println("SQLException: " + ex.getMessage());
		      System.out.println("SQLState: " + ex.getSQLState());
		      System.out.println("VendorError: " + ex.getErrorCode());
		      System.out.println("Não Conectou");
		      return null;
		    }
		    catch(Exception e){
		      System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
		      return null;
		    }
		  }
	   public String getStatus(){
	       return status;
	   }
	   public Connection getConexao(){
	       return conexao;
	   }
	   
  
public double queryMySQL(){
		Conectar();
		ResultSet rs;
		double latitude=0;
	   
      try{
    	  rs = st.executeQuery("SELECT latitude FROM localizacao;"); 
          latitude=rs.getDouble(1);
          System.out.println("Consultou");
      } catch (Exception erro){
    	  erro.printStackTrace();
         
      }
      return latitude;
  }

}

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.

Deixei a classe main assim:

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Conexao con = new Conexao();
		System.out.println(con.queryMySQL());
	

	}

}

E o erro persiste :

Conectou
java.lang.NullPointerException
	at Conexao.queryMySQL(Conexao.java:52)
	at Main.main(Main.java:10)
V
Fica assim:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Conexao {
	private Connection conectar() {
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			return DriverManager.getConnection(
					"jdbc:mysql://localhost/mapa", "root", "admin");			
		} catch (SQLException ex) {
			System.err.println("SQLState: " + ex.getSQLState());
			System.err.println("VendorError: " + ex.getErrorCode());
			System.err.println("SQLException: ");
			ex.printStackTrace();
			throw new RuntimeException(ex);								
		} catch (Exception e) {
			System.err.println("Problemas ao tentar conectar com o banco de dados: ");
			e.printStackTrace();			
			throw new RuntimeException(e);
		}		
	}

	public double queryLatitude() {
		Connection conn = conectar();
		PreparedStatement stmt = null;
		ResultSet rs = 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;
			
			return rs.getDouble("latitude");
		} catch (Exception erro) {
			throw new RuntimeException(erro);
		} finally {
			//Fecha o statement, o resultset e a conexão
			if (rs != null) try { rs.close(); } catch (Exception e) {}
			if (stmt != null) try { stmt.close(); } catch (Exception e) {}			
			try { conn.close(); } catch (Exception e) {}
		}
	}
	
	public static void main(String[] args) {
		Conexao conn = new Conexao();
		System.out.println(conn.queryLatitude());
	}
}
A

Aêeeeeeeeeeee, valeu mano, agora sim deu certo!

A

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:

package com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {
	private Connection conectar() {  
        try {  
            Class.forName("com.mysql.jdbc.Driver").newInstance();  
            return DriverManager.getConnection(  
                    "jdbc:mysql://localhost/mapa", "root", "admin");              
        } catch (SQLException ex) {  
            System.err.println("SQLState: " + ex.getSQLState());  
            System.err.println("VendorError: " + ex.getErrorCode());  
            System.err.println("SQLException: ");  
            ex.printStackTrace();  
            throw new RuntimeException(ex);                               
        } catch (Exception e) {  
            System.err.println("Problemas ao tentar conectar com o banco de dados: ");  
            e.printStackTrace();              
            throw new RuntimeException(e);  
        }         
    }  
  
	public double queryLatitude() {  
        Connection conn = conectar();  
        PreparedStatement stmt = null;  
        ResultSet rs = 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;  
              
            return rs.getDouble("latitude");  
        } catch (Exception erro) {  
            throw new RuntimeException(erro);  
        } finally {  
            //Fecha o statement, o resultset e a conexão  
            if (rs != null) try { rs.close(); } catch (Exception e) {}  
            if (stmt != null) try { stmt.close(); } catch (Exception e) {}            
            try { conn.close(); } catch (Exception e) {}  
        }  
    }  
    public double queryLongitude() {  
        Connection conn = conectar();  
        PreparedStatement stmt = null;  
        ResultSet rs = 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;  
              
            return rs.getDouble("longitude");  
        } catch (Exception erro) {  
            throw new RuntimeException(erro);  
        } finally {  
            //Fecha o statement, o resultset e a conexão  
            if (rs != null) try { rs.close(); } catch (Exception e) {}  
            if (stmt != null) try { stmt.close(); } catch (Exception e) {}            
            try { conn.close(); } catch (Exception e) {}  
        }  
    }  	   
   
}
A
ViniGodoy:
Fica assim:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Conexao {
	private Connection conectar() {
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			return DriverManager.getConnection(
					"jdbc:mysql://localhost/mapa", "root", "admin");			
		} catch (SQLException ex) {
			System.err.println("SQLState: " + ex.getSQLState());
			System.err.println("VendorError: " + ex.getErrorCode());
			System.err.println("SQLException: ");
			ex.printStackTrace();
			throw new RuntimeException(ex);								
		} catch (Exception e) {
			System.err.println("Problemas ao tentar conectar com o banco de dados: ");
			e.printStackTrace();			
			throw new RuntimeException(e);
		}		
	}

	public double queryLatitude() {
		Connection conn = conectar();
		PreparedStatement stmt = null;
		ResultSet rs = 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;
			
			return rs.getDouble("latitude");
		} catch (Exception erro) {
			throw new RuntimeException(erro);
		} finally {
			//Fecha o statement, o resultset e a conexão
			if (rs != null) try { rs.close(); } catch (Exception e) {}
			if (stmt != null) try { stmt.close(); } catch (Exception e) {}			
			try { conn.close(); } catch (Exception e) {}
		}
	}
	
	public static void main(String[] args) {
		Conexao conn = new Conexao();
		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:

Tenho um problema semelhante que é o seguinte:

- Fiz um WebService que faz consulta ao banco de dados e ele retorna os dados em um XML, porém ele não retorna todos os dados, ele encontra o primeiro resultado e traz ele duas vezes, veja o código:

[code]

public List queryLatitude2() {
		Connection conn = conectar();
		PreparedStatement stmt = null;
		ResultSet rs = null;
        List<Double> lista = new ArrayList<Double>();
		try {
			stmt = conn
					.prepareStatement("SELECT latitude FROM localizacao;");
			rs = stmt.executeQuery();

			while (rs.next()){ // NÃo  latitude a retornar
				Double d;
				d = rs.getDouble("latitude");
				lista.add(d);
			}
		
			return lista;

		} catch (Exception erro) {
			throw new RuntimeException(erro);
		} finally {
			// Fecha o statement, o resultset e a conexão
			if (rs != null)
				try {
					rs.close();
				} catch (Exception e) {
				}
			if (stmt != null)
				try {
					stmt.close();
				} catch (Exception e) {
				}
			try {
				conn.close();
			} catch (Exception e) {
			}
		}
	}
[/code]
V

Me parece certo, ou só faria assim:

public List<Double> queryLatitude2() {
    Connection conn = conectar();
    PreparedStatement stmt = null;
    ResultSet rs = 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"));
        }
		
        return lista;
    } catch (Exception erro) {
        throw new RuntimeException(erro);
    } finally {
        // Fecha o statement, o resultset e a conexão
        if (rs != null) try { rs.close(); } catch (Exception e) {}
        if (stmt != null) try { stmt.close(); } catch (Exception e) {}
        try { conn.close(); } catch (Exception e) {}
    }
}
Criado 24 de março de 2012
Ultima resposta 16 de abr. de 2012
Respostas 13
Participantes 3