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

Erro ao comparar o proprietário da conta.

Estou com o seguinte código, respectivo ao assunto:

public class TestaOrdenacao {
    public static void main(String[] args) {
        List<Conta> contas = new ArrayList<Conta>();
        Random random = new Random();

        ContaPoupanca c1 = new ContaPoupanca(random.nextInt(2000), "Caio");
        c1.deposita(random.nextInt(10000) + random.nextDouble());
        contas.add(c1);

        ContaPoupanca c2 = new ContaPoupanca(random.nextInt(2000), "Adriano");
        c2.deposita(random.nextInt(10000) + random.nextDouble());
        contas.add(c2);

        ContaPoupanca c3 = new ContaPoupanca(random.nextInt(2000), "Victor");
        c3.deposita(random.nextInt(10000) + random.nextDouble());
        contas.add(c3);

        Collections.sort(contas);

        for (Conta conta : contas) {
          System.out.println(conta);
           }

       // for (Conta p : contas) {   
         //   System.out.println(contas);
       // } 
      }
public class Conta implements Comparable<Conta> {
    protected int numero;
    private String nomeDoCliente;

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public int getNumero() {
        return numero;
    }

    public int compareTo(Conta outra) {
      //  return this.getNumero() - outra.getNumero();
        return this.nomeDoCliente.compareTo(outra.nomeDoCliente);
    }

    public String getNomeDoCliente() {
        return nomeDoCliente;
    }

    public void setNomeDoCliente(String nomeDoCliente) {
        this.nomeDoCliente = nomeDoCliente;
    }


}
public class ContaPoupanca extends Conta {
private int i;
private String string;
private double saldo;


     public ContaPoupanca(int i, String string) {
         this.i = i;
         this.string = string;
    }

    //public int compareTo(ContaPoupanca outra) {
      //      return this.getNumero() - outra.getNumero();
       // }

     public int compareTo(ContaPoupanca outra) {
            return this.getNomeDoCliente().compareTo(outra.getNomeDoCliente());
        }

    public void deposita(double d) {
        saldo +=d;
    }

    public String toString (){
        return string;
    }


}

Porem esta me retornando, erro nas seguintes linhas: Classe conta: return this.nomeDoCliente.compareTo(outra.nomeDoCliente); Classe testaOrdenação: Collections.sort(contas); O código não funciona.

3 respostas

A classe conta esta implementando a Comparable mas a conta poupança não. Se você reescreve o método, a classe filha deve implementar a interface Comparable também. Veja se não é isso ;(

O erro ainda continua, nas seguintes linhas:

Classe conta

public class Conta implements Comparable<Conta> {
   this.nomeDoCliente.compareTo(outra.nomeDoCliente);

Classe TestaOrdenação

Collections.sort(contas);
solução!

Jessica, sua intenção ao criar a classe ContaPoupanca era que ela usasse os atributos numero e nomeDoCliente da classe Conta, certo?

Porém, ao criar a classe, você criou novos atributos i e string. O erro acontece aqui, pois quando você implementa o método compareTo você compara o nomeDoCliente, que está nulo, tentando chamar um método nele! Aí recebe uma exceção!

Então vamos a alguns pontos: 1. Para usar os atributos da classe mãe, você não precisa declará-lo de novo. 2. Se o atributo por protected, você pode acessá-lo diretamente pela variável (this.atributo = valor) 3. Se o atributo for privado, você ainda pode lê-lo e alterá-lo caso a classe mãe tenha respectivamente seu getter e setter.

Arrumei umas coisinhas na sua classe Conta, todas descritas abaixo:

public class Conta implements Comparable<Conta> {
    /*
     * AMBOS numero e nomeDoCliente podem ser private ou protected
     * a diferença é que se for protected, não precisa usar o setter no construtor da ContaPoupanca
     */
    private int numero;
    private String nomeDoCliente;

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public int getNumero() {
        return numero;
    }

    public void setNomeDoCliente(String nomeDoCliente) {
        this.nomeDoCliente = nomeDoCliente;
    }

    public String getNomeDoCliente() {
        return nomeDoCliente;
    }

    public int compareTo(Conta outra) {
        return this.nomeDoCliente.compareTo(outra.nomeDoCliente);
    }

    // sobrescrever o toString pode ser aqui na classe conta também
    public String toString() {
        return nomeDoCliente;
    }
}

Escrevi o código da classe ContaPoupanca, que não precisa implementar Comparable já que extende uma classe que implementa!

public class ContaPoupanca extends Conta {
    // repare que aqui só tem o atributo saldo. os outros são herdados!
    private double saldo;

    public ContaPoupanca(int num, String nome) {
        /*
         * repare que aqui usamos os setters da classe Conta
         * se os atributos fossem protected, poderiamos fazer a atribuicao direta, assim:
         * this.numero = num;
         * this.nomeDoCliente = nome;
         */
        setNumero(num);
        setNomeDoCliente(nome);
        // atribuir o valor zero ao saldo na criação da conta
        saldo = 0;
    }

    // não vamos usar o setter do saldo, somente o getter!
    public double getSaldo(double saldo) {
        return saldo;
    }

    public void deposita(double deposito) {
        saldo += deposito;
    }
}

Espero que tenha entendido, mas não hesite em perguntar mais se precisar!