Ajuda com passagem por referência em Java

22 respostas
Valter_Henrique

Oi GUJ,
pessoal, sei que java não trabalha com ponteiros como em C++ (adoro C++,rs).

Estou com um problema que não consigo entender porque volta null no objeto ‘usuario’:

//Chamando o método 'login'
        Usuario usuario = new Usuario();
        BancoDados bd = new BancoDados();
        String status = bd.login(email, senha, usuario);
//Método login
    public String login(String email, String senha, Usuario usuario) {
        String status = "login_correto";
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        try {
            Query query = session.createQuery("from Usuario where email = '" + email + "' and senha = '" + senha + "'");
            if (query.list().size() > 0){
                usuario = (Usuario) query.list().get(0);
                System.out.println("BANCO DADOS - LOGIN");
                usuario.exibir();
            }else{
                status = "login_incorreto";
            }
        } catch (HibernateException he) {
            System.out.println("Exceção em Banco de dados - login:" + he.getCause().getLocalizedMessage());
            status = he.getCause().getLocalizedMessage();
        }

        return status;
    }

Então quando ele termina de executar o método login, o objeto usuario que eu referenciei volta null…
O que esta errado ?

Abraços.

22 Respostas

renanreismartins

ola, respondendo sua questao:

porque a posição 0 da lista retorna null, linha 10. Isso se deve ao fato de sua consulta nao retornar nenhum resultado.

Agora algumas consideraçoes do codigo:

um metodo que recebe login, senha e usuario dps retorna uma string nao me parece muito bem elaborado.
Da a impressao que vc depende da string de retorno para fazer o fluxo da aplicação, tecnica conhecida como Orientacao a Strings…

envie login e senha e retorne um usuario ou um boolean indicando se o usuario foi logado com sucesso.

tambem nao concatene strings para formar queries como na linha 8.

abrassss

denislima

Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0);

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s

Valter_Henrique

denislima:
Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0);

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s


Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.

kenneth

Fala brow,

Isso aqui:

query.list().get(0)

Esta retornando algum registro?

Valter_Henrique

renanreismartins:
ola, respondendo sua questao:

porque a posição 0 da lista retorna null, linha 10. Isso se deve ao fato de sua consulta nao retornar nenhum resultado.

Agora algumas consideraçoes do codigo:

um metodo que recebe login, senha e usuario dps retorna uma string nao me parece muito bem elaborado.
Da a impressao que vc depende da string de retorno para fazer o fluxo da aplicação, tecnica conhecida como Orientacao a Strings…

envie login e senha e retorne um usuario ou um boolean indicando se o usuario foi logado com sucesso.

tambem nao concatene strings para formar queries como na linha 8.

abrassss

Então Renan,
eu estou retornando uma string para poder tratar melhor as exceções que podem ser lançadas.
Na verdade eu queria passar o objeto usuario e no mesmo método retornar a string com o status da operação entendeu ?

E sobre não concatenar string na query eu não entendi, por que não se pode concatenar ?

Abraços.

Valter_Henrique

kenneth:
Fala brow,

Isso aqui:

query.list().get(0)

Esta retornando algum registro?


Tah sim brother.

renanreismartins

oi Valter, entendi sim… ainda acho que controlar o fluxo por strings pode ser ruim, lance as exceçoes.

Nao é legal concatenar devido aos perigos de um SQL Injection. Bem como existem outras maneiras de deixar seu codigo muito mais elegante.

Query query = session.createQuery("from Usuario where email = :email and senha = senha");  

query.setParameter("email", email);

alem de poder usar Criteria.

Sugiro que vc faça um debug do metodo inteiro, acompanhe seu objeto usuario e veja em qual linha ele se torna nulo

grande abrasss

denislima

Valter Henrique:
denislima:
Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0);

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s


Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA!

Da uma olhada nesses topicos, eles discutem isso tbem:
http://www.guj.com.br/posts/list/24894.java
http://www.guj.com.br/posts/list/19722.java

Valter_Henrique

renanreismartins:
oi Valter, entendi sim… ainda acho que controlar o fluxo por strings pode ser ruim, lance as exceçoes.

Nao é legal concatenar devido aos perigos de um SQL Injection. Bem como existem outras maneiras de deixar seu codigo muito mais elegante.

Query query = session.createQuery("from Usuario where email = :email and senha = senha");  

query.setParameter("email", email);

alem de poder usar Criteria.

Sugiro que vc faça um debug do metodo inteiro, acompanhe seu objeto usuario e veja em qual linha ele se torna nulo

grande abrasss

Entendi Renan (sobre concaternar a string na query).
Então cara, ele dentro do try não é nulo, mas quando ele sai do método ele se torna nulo.

Valter_Henrique

denislima:
Valter Henrique:
denislima:
Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0);

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s


Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA!

(tem mesmo necessidade dessa caixa alta cara ?)

denislima

Valter Henrique:
denislima:
Valter Henrique:
denislima:
Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0);

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s


Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA!

(tem mesmo necessidade dessa caixa alta cara ?)

hehehe… desculpa… nao interprete mal…coloquei mais para destacar a frase msm… nao falei “gritando” nao…

da uma olhada nesses topicos eles discutem esse assunto:
http://www.guj.com.br/posts/list/24894.java
http://www.guj.com.br/posts/list/19722.java

abracos

renanreismartins

verifique se vc nao passa nulo pra ele dentro do metodo exibir()…

sobre as strings e exceçoes, creio que vc encontrará uma boa explicação no blog da caelum ou apostila do fj11

abrassss

Valter_Henrique

denislima:
Valter Henrique:
denislima:
Valter Henrique:
denislima:
Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0);

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s


Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA!

(tem mesmo necessidade dessa caixa alta cara ?)

hehehe… desculpa… nao interprete mal…coloquei mais para destacar a frase msm… nao falei “gritando” nao…

da uma olhada nesses topicos eles discutem esse assunto:
http://www.guj.com.br/posts/list/24894.java
http://www.guj.com.br/posts/list/19722.java

abracos

Tranquilo brother valeu pelos links.

Valter_Henrique

renanreismartins:
verifique se vc nao passa nulo pra ele dentro do metodo exibir()…

sobre as strings e exceçoes, creio que vc encontrará uma boa explicação no blog da caelum ou apostila do fj11

abrassss


Valeu Renan, já baixei a apostila,rs.

Valter_Henrique

Galera, seguindo a orientações de todos, resolvi e ficou assim:

BancoDados bd = new BancoDados();
        Usuario usuario = bd.login(email, senha);

        if (usuario == null){
            status = "login_incorreto";
        }
         
        //esse método trata a exceções
        retornarStatus(request, response, status, usuario);
//Método login
    public  Usuario login(String email, String senha) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Usuario usuario = null;

        try {
            Query query = session.createQuery("from Usuario where email = :email and senha = :senha");
            query.setParameter("email", email);
            query.setParameter("senha", senha);

            if (query.list().size() > 0){
                usuario = (Usuario) query.list().get(0);
            }
        } catch (HibernateException he) {
            System.out.println("Exceção em Banco de dados - login:" + he.getCause().getLocalizedMessage());
        }

        return usuario;
    }

Valeu galera.

E ai Renan, ficou elegante agora ?rs (brincadeira,rs)

Abraços.

renanreismartins

sim… melhor… agora falta soh fechar a transacao e a session rsrs

abrasssss

Valter_Henrique

renanreismartins:
sim… melhor… agora falta soh fechar a transacao e a session rsrs

abrasssss

Renan, sou novo no Hibernate velho, pelo que vi faltou um :

session.clear();
            session.close();

Eh isso ? (para fechar a transação e a sessão corretamente ? )

renanreismartins

n esquenta é assim mesmo… vc deve fazer algo como:

Transaction tx = session.beginTransaction();  
// codigo....
tx.commit();

session.close();

abrassss

Valter_Henrique

renanreismartins:
n esquenta é assim mesmo… vc deve fazer algo como:

Transaction tx = session.beginTransaction();  
// codigo....
tx.commit();

session.close();

abrassss

Eh que eu achei que o hibernate já fazia isso automaticamente.
Isso conserva o pool ?

renanreismartins

se ela estiver sendo obtida de um pool sim.

abrasssss

Valter_Henrique

renanreismartins:
se ela estiver sendo obtida de um pool sim.

abrasssss


Deveria ficar assim então , certo ?

public Usuario login(String email, String senha) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Usuario usuario = null;

        try {
            Query query = session.createQuery("from Usuario where email = :email and senha = :senha");
            query.setParameter("email", email);
            query.setParameter("senha", senha);

            if (query.list().size() > 0) {
                usuario = (Usuario) query.list().get(0);
            }

        } catch (HibernateException he) {
            session.getTransaction().rollback();
            System.out.println("Exceção em Banco de dados - login:" + he.getCause().getLocalizedMessage());
        } finally {
           session.close(); 
       }

        return usuario;
    }

Eu utilizaria esse finally em todos os métodos ?

renanreismartins

isso, apenas de commit dentro do try… legal!

sim, teria de utilizar, pois vc está pegando a session e abrindo a transação na mão.

entao tb deve encarregar-se de fechar!

esse problema é bem chato: administrar conexoes e transações.

Uma boa solução é utilizar algo que cuide disso pra vc, como EJB ou entao um containver leve, como spring.

mas é essencial aprender os conceitos antes… vc está no caminho!

abrassss

Criado 21 de fevereiro de 2011
Ultima resposta 21 de fev. de 2011
Respostas 22
Participantes 4