Qual é o erro ? Mais um NullPointerException

3 respostas
C

Pessoal, estou desenvolvendo uma classe somente para conectar com o MySql. Pois assim eu posso ahamar o metodo dessa classe que vai me servir em qualquer aplicação certo ? O problema é que está dando o seguinte erro: “java.lang.NullPointerException”

Eis o código:

import java.sql.*;
import java.io.*;

import org.gjt.mm.mysql.Driver;

class Conexao
{
  public boolean Conecta(Connection con)
  {
    String fonte = "jdbc:mysql://localhost/cotamil";
    String user = "";
    String senha = "";

    boolean testa = false;

    con = null;
    //PreparedStatement pst = null;
    //ResultSet rs = null;

    try
    {
      Class.forName("org.gjt.mm.mysql.Driver");
      con = DriverManager.getConnection(fonte,user,senha);
      testa = true;

      System.out.println("CONECTEI ? "+testa);

    }catch(Exception e)
     {
       e.printStackTrace(System.out);
     }

     return testa;
  }
  public static void main(String args[])
  {
    Connection con = null;
    PreparedStatement pst = null;
    ResultSet rs = null;

    Conexao conexao = new Conexao();
    conexao.Conecta(con);

    try
    {
      pst = con.prepareStatement(CONSULTA);
      rs = pst.executeQuery();

      while(rs.next())
      {
        System.out.println(rs.getString(1));
      }

    }catch(Exception e)
     {
       e.printStackTrace(System.out);
     }
  }
  private final static String CONSULTA = "select senha from usuario";
}

por favor, me ajudem !!
Obrigado,
João Paulo

3 Respostas

Bani

O problema é que na linha:
pst = con.prepareStatement(CONSULTA);
O objeto con está nulo.

Olha, achei meio confuso o que você fez com ele... Esse negócio de passá-lo para o método Conecta, e logo de cara deixá-lo null... está tudo bem estranho.
É importante você lembrar que em Java os objetos são passados por valor, não por referência. Sugiro que você repense como trabalhar com esse con.
Simplesmente retorná-lo no final já resolveria o problema, apesar de que acho que dá pra melhorar mais...
Fica assim:

import java.sql.*;
import java.io.*;

import org.gjt.mm.mysql.Driver;

class Conexao
{
  public Connection Conecta(Connection con)
  {
    String fonte = "jdbc:mysql://localhost/cotamil";
    String user = "";
    String senha = "";

    boolean testa = false;

    con = null;
    //PreparedStatement pst = null;
    //ResultSet rs = null;

    try
    {
      Class.forName("org.gjt.mm.mysql.Driver");
      con = DriverManager.getConnection(fonte,user,senha);
      testa = true;

      System.out.println("CONECTEI ? "+testa);

    }catch(Exception e)
     {
       e.printStackTrace(System.out);
     }

     return con;
  }
  public static void main(String args[])
  {
    Connection con = null;
    PreparedStatement pst = null;
    ResultSet rs = null;

    Conexao conexao = new Conexao();
    con = conexao.Conecta(con);

    try
    {
      pst = con.prepareStatement(CONSULTA);
      rs = pst.executeQuery();

      while(rs.next())
      {
        System.out.println(rs.getString(1));
      }

    }catch(Exception e)
     {
       e.printStackTrace(System.out);
     }
  }
  private final static String CONSULTA = "select senha from usuario";
}
C

Bem, a forma com que vc está abrindo uma conexão naum é a mais
eficiente, pois vc está trabalhando com o URL do banco em um String fixo, o que o obriga recompilar a classe caso esse URL mude. O correto é defini-lo em um arquivo de propriedades ou no web.xml em caso desta classe ser chamada de um Servlet, mas td bem.
Quando vc passa uma variavel para um método, a JVM copia o endereço contido nesta variável para a pilha de chamada do metodo, neste caso será copiado null, pois a variavel em ‘main’ assim foi inicializada. Dentro do metodo, o que vc tem é uma variável local cuja referencia aponta para o mesmo local que sua variavel em ‘main’, no entanto ela naum é sua variável em main.
Quando vc chama o metodo factory getConnection() , ele retorna uma referencia para um objeto Connection, a qual será copiada para a sua variavel local. A regra é a mesma dos ponteiros em C++.
Apesar de que, se vc retornar essa variavel local resolva o seu problema, passar um referencia como argumento do metodo é totalmente inútil.
Faça assim :

public Connection openConnection( Properties prop )
  {
         Connection c = null;
         String URL  = (String)prop.getProperty( "jdbc.url" );
         String user  = (String)prop.getProperty( "jdbc.user" );
         String psw  = (String)prop.getProperty( "jdbc.psw" );
         String driver = (String)prop.getProperty( "jdbc.driver" );

         try{
              Class.forName( driver );
              c = DriverManager.getConnection( URL , user , psw );
         }catch( Exception  ignored ){}
         return c;
  }

[]´s
Claudio Gualberto.

C

Valeu, realmente eu tenho que estudar mais essa parte de passagem de parâmetros.

Obrigado e bons códigos,
Feliz 2003 !!

Criado 27 de dezembro de 2002
Ultima resposta 30 de dez. de 2002
Respostas 3
Participantes 3