[RESOLVIDO] non-static method cannot be referenced

8 respostas
manuBittencourt

Boa tarde.

Estou estudando sobre conexão com o MySQL e seguindo os passos de um tutorial.
No tutorial, há uma classe Conexao com o seguinte método:

public class Conexao {
    private String url = "jdbc:mysql://127.0.01/tutorial?user=root&password=root";
    
    public void abrirConexao(){
        try{
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection con = DriverManager.getConnection(url);
            System.out.println("Conexao com Banco de Dados establecida.");
        }
        catch (SQLException erroSQL) {
            System.out.println("Erro na conexão com o Banco "+erroSQL.getMessage());
        }
        catch (ClassNotFoundException erroClass){
            System.out.println("Erro ao carregar o Driver "+erroClass.getMessage());
        }
        catch (Exception e){
            System.out.println("Ocoreru um erro: "+e.getMessage());
        }
    }


 public static void main (String[] args){
        new Conexao().abrirConexao();
    }
}

E há também a classe principal Teste:

public class Teste {
    public static void main(String[] args){
        Connection con = Conexao.abrirConexao();
    }
    
}

Ele não aceita essa linha Connection con = Conexao.abrirConexao(); dano o erro “non-static method abrirConexao() cannot be referenced from a static context”.

Onde está meu erro?

Obrigada de antemão!

8 Respostas

Rodrigo_Sasaki

se você quer atribuir o retorno do seu método abrirConexao() à uma variável, o tipo de retorno dele não pode ser void

no caso tem que ficar assim:

public Connection abrirConexao(){
    //implementação
}
manuBittencourt

digaoneves:
se você quer atribuir o retorno do seu método abrirConexao() à uma variável, o tipo de retorno dele não pode ser void

no caso tem que ficar assim:

public Connection abrirConexao(){
    //implementação
}

Fiz a alteração mas continuou apontando o mesmo erro no main.

Rodrigo_Sasaki

Desculpe, não me atentei a um detalhe…

você está invocando seu método de maneira estática… NomeDaClasse.nomeDoMetodo();

para fazer isso seu método precisa estar declarado como static

public static Connection abrirConexao(){
    //implementação
}

se o método não for estático você precisa instanciar um objeto para ter acesso a eles.

ex:

public static void main(String[] args){
    Conexao conexao = new Conexao();
    Connection con = conexao.abrirConexao();
}
J
public class Conexao {  
        private String url = "jdbc:mysql://127.0.01/tutorial?user=root&password=root";  
          

        public Connection abrirConexao(){  
            try{  
                Class.forName("com.mysql.jdbc.Driver").newInstance();  
                Connection con = DriverManager.getConnection(url);  
                System.out.println("Conexao com Banco de Dados establecida.");  
            }  
            catch (SQLException erroSQL) {  
                System.out.println("Erro na conexão com o Banco "+erroSQL.getMessage());  
            }  
            catch (ClassNotFoundException erroClass){  
                System.out.println("Erro ao carregar o Driver "+erroClass.getMessage());  
            }  
            catch (Exception e){  
                System.out.println("Ocoreru um erro: "+e.getMessage());  
            }  
              return conn;
        }  
      
      
    public static void main (String[] args){  
            Connection conexao = new Conexao().abrirConexao();  
        }  
    }

No caso da classe principal:

public class Teste {  
        public static void main(String[] args){  
            Connection con = new Conexao().abrirConexao();  
        }  
          
    }

Se quiser fazer a chamada diretamente, seu método deve ser estático.
Caso contrário precisa criar uma nova instância da classe.

manuBittencourt


se o método não for estático você precisa instanciar um objeto para ter acesso a eles.

ex:

public static void main(String[] args){ Conexao conexao = new Conexao(); Connection con = conexao.abrirConexao(); }

Isso mesmo, deu certo! :smiley:

Mas eu só não entendi uma coisa. Na classe Conexao, ao final dela, tem o código:

public static void main (String[] args){  
        new Conexao().abrirConexao();  
    }

Achei que essa linha já servia para instanciar o método…

Rodrigo_Sasaki

não entendi o que você não entendeu.

nessa linha você está criando uma instância da classe Conexão e invocando um método, porém não está guardando a referência à esta instância.

EDIT:

exemplo de quando se guarda a referência:

Conexao conexao = new Conexao(); // se você guarda a referência pode manipular o objeto como quiser

conexao.abrirConexao();
conexao.fecharConexao();
conexao.blablabla();

agora se não guarda normalmente é porque só precisa do retorno de um método específico da classe, ou algo assim... como no seu exemplo:

Connection con = new Conexao().abrirConexao();
manuBittencourt

Entendi!

Obrigada a todos que responderam.

Rodrigo_Sasaki

Se sua dúvida foi sanada, altere o título do seu primeiro post nesse tópico e adicione a tag [RESOLVIDO], por favor…

ajuda outras pessoas que tiverem a mesma dúvida que você, e ajuda quem estiver online no forum a saber que este tópico ja foi resolvido.

Obrigado.

Criado 24 de abril de 2012
Ultima resposta 24 de abr. de 2012
Respostas 8
Participantes 3