Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Como imprimir os objetos que meu array referencia?

O código até compilou, mas nao executou. De qualquer forma se executasse, acredito que (da forma como coloquei) a saída seria as referências e não os objetos.

class Programa {
  public static void main(String[] args) {
    Conta[] minhasContas = new Conta[4];//Aqui Foram criados 10 espaços para referenciar contas

    Conta contaJose = new Conta();
    contaJose.titular.nome = "Jose";
    contaJose.saldo = 1000.0;

    Conta contaMaria = new Conta();
    contaMaria.titular.nome = "Maria";
    contaMaria.saldo = 2000.0;

    Conta contaPedro = new Conta();
    contaPedro.titular.nome = "Pedro";
    contaPedro.saldo = 3000.0;

    Conta contaLucas = new Conta();
    contaLucas.titular.nome = "Lucas";
    contaPedro.saldo = 4000.0;

    for(int i = 0; i < minhasContas.length; i++) {
      System.out.println(minhasContas[i]);
    }
  }
}
9 respostas

Oi Geovane! Tudo certo?

Para imprimir as informações da conta, você precisa implementar o método toString() em sua classe Conta.

por exemplo:

@Override
public String toString(){
    return "nome: " + nome +  " saldo: " + saldo;
}

nao entendi

Geovane, sempre que você utiliza o System.out.println() em algum objeto, internamento a JVM executa o metodo toString () do seu objeto, a implementacao padrao dele é imprimir a referencia.

Para imprimir as informações do objeto, você terá que sobreescrever o método toString() conforme o Philippe Ehlert exemplificou.

Oi Geovane!

Pelo código que vc colocou lá em cima, vc está percorrendo o seu array, mas ele imprime null por não ter nada adicionado nele, vc criou as contas mas não passou elas para o array, vc pode fazer isso por exemplo fazendo:

minhasContas[0] = contaJose;

Porém ao imprimir vc não vai ter os dados das contas exibidas, mas sim algo como:

br.com.alura.modelos.Conta@15db9742

Isso vai ocorrer pq como o Philippe Ehlert falou, vc precisa implementar o toString, faça a implementação e então tudo vai funcionar. :-D

Boa tarde Geovane,

Você está usando o System.out.println, esse método imprime texto (strings). Como você passou um objeto para ele (instancia de Conta), ele vai buscar dentro desse objeto um método toString() para obter a representação textual do mesmo. Como não é encontrado, ele vai utilizar o método toString() da classe mãe de Conta, que é Object. Toda classe em Java é filha dessa classe, logo todos tem um método toString() herdado dela. A implementação padrão da classe Object fará a saída igual o Hallesandro comentou aqui em cima.

Então, para classes novas que você cria, o toString() herdado não mostra os atributos do seu objeto, afinal não teria como saber qual seriam estes. Por isso você deve sobrescrever o método da classe mãe e implementar o retorno que você precisa.

No seu Eclipse vá na sua classe Conta, digite toString e pressione um CTRL + Enter, escolha a opção toString() - Override metho in Object. Com isso o método será criado para você, e basta você retornar nele a representação textual do seu objeto como você achar melhor (olhe a sugestão da resposta do Philippe).

Caso você use outro editor de texto que não tenha a facilidade deste atalho, basta copiar o exemplo do Philippe e colocar na sua classe Conta que já vai funcionar.

Ficou alguma dúvida?

Abraço.

solução!

Olá, Geovane e pessoal!

Lembrando que Geovane ainda está no capítulo de Arrays do módulo Java I. Ele ainda não sabe sobre sobrescrita (override), então, o certo é explicar para ele sem usar isso.

Geovane, esqueça toString, você vai ver isso mais pra frente.

Como o Hallessandro explicou corretamente, você está criando as instâncias, mas em nenhum momento está adicionando elas ao seu vetor!!! A cada criação da instância, depois de preencher os atributos, lembre-se de passar a referência para o vetor.

Seu código deveria estar assim:

Conta contaJose = new Conta();
contaJose.titular.nome = "Jose";
contaJose.saldo = 1000.0;
minhasContas[0] = contaJose; // nova linha

Conta contaMaria = new Conta();
contaMaria.titular.nome = "Maria";
contaMaria.saldo = 2000.0;
minhasContas[1] = contaMaria; // nova linha

Conta contaPedro = new Conta();
contaPedro.titular.nome = "Pedro";
contaPedro.saldo = 3000.0;
minhasContas[2] = contaPedro; // nova linha

Conta contaLucas = new Conta();
contaLucas.titular.nome = "Lucas";
contaLucas.saldo = 4000.0; // corrigi essa linha que estava usando contaPedro
minhasContas[3] = contaLucas; // nova linha

Depois de feita essa correção, você precisa imprimir os valores corretamente no seu loop. Exemplo:

for(int i = 0; i < minhasContas.length; i++) {
    System.out.println("Titular: " + minhasContas[i].titular.nome);
    System.out.println("Saldo: " + minhasContas[i].saldo);
}

Melhor agora?

Arthur, Valeu. Você entendeu bem a minha pergunta e me deu uma solução que eu consegui entender.

Agora, quando vou executar aponta esse erro:

Exception in thread "main" java.lang.NullPointerException
        at Programa.main(Programa.java:6)

O que pode ser?

Veja o erro, ele te diz onde foi o problema:

at Programa.main(Programa.java:6)

Foi na linha 6 do seu código. A linha 6 do seu código é a seguinte:

contaJose.titular.nome = "Jose";

O erro NullPointerException significa que você está tentando acessar um atributo ou método de uma referência que está nula.

Nessa linha especificamente há duas referências: contaJose e titular. A variável contaJose sabemos que não está nula, pois você criou uma instância na linha 5 do seu código.

O problema está no atributo titular. Na sua classe Conta, você tem um atributo chamado titular que é uma referência para outra classe (Cliente, provavelmente). Em nenhum momento você criou uma instância nova de um Cliente e preencheu esse atributo, portanto, ele está nulo.

Quando você executa o código e, na linha 6, tenta acessar o atributo titular e preencher o nome, dá o erro.

Seu código para funcionar tem que estar da seguinte forma:

Conta contaJose = new Conta();
contaJose.titular = new Cliente(); // nova linha
contaJose.titular.nome = "Jose";
contaJose.saldo = 1000.0;
minhasContas[0] = contaJose;

Só fiz para uma das contas, mas é o mesmo código para as outras, só muda a variável contaJose.

Ajudou?

Sim, deu certo e entendi. Muito obrigado.

Obrigado a todos que tentaram me ajudar.