Dúvida básica, usando pela primeira vez o Comparable e compareTo

Dúvida básica, usando pela primeira vez o Comparable e compareTo… Pq dá pau? Erro de execução… NullPointerException…

[code]package corejava.comparetocomparablecompator2;

public class ContaCorrente implements Comparable {

private int saldo;// = (int) 600.00;// casting

public int getSaldo() {
	return saldo;
}

public void setSaldo(int saldo) {
	this.saldo = saldo;
}

public int compareTo(ContaPoupanca contaPoupanca) {
	if (getSaldo() == contaPoupanca.getSaldo()) {
		System.out.println("Saldo de CC é igual CP");
		return -1;
	}
	if (getSaldo() != contaPoupanca.getSaldo()) {
		System.out.println("Saldo de CC diferente de CP");
		return 0;
	}
	return 0;
}

public static void main(String[] args) {
	ContaPoupanca cp1 = new ContaPoupanca();
	cp1.setSaldo(100);
	
	new ContaCorrente().setSaldo(50);
	
	new ContaCorrente().compareTo(null);
}

}[/code]

Dá NullPointerException na sua linha 16, não? Isso quando você passa null para compareTo.

É que percebí q qdo. não ponho null dá erro de compilação… Tem alguma sugestão?

Não escreva programas usando o compilador para tirar os erros de compilação. (não passe null para um método só para tirar o erro de compilação).
Escreva programas usando a cabeça e lendo a documentação. O javadoc é seu amigo e você, de quebra, aprende inglês.

Quando você usa compareTo, é para comparar com outro objeto ContaPoupanca, não? Crie esse outro objeto para poder fazer a comparação.

não entendi pq o null???

hmmm… será q se não for pedir muito… se pudesse… vc poderia escrever o código correto pra mim? fiz já bastante mudança de acordo com q foi dito…

abração

Por que você está comparando coisas de classes diferentes?

[code]package corejava.comparetocomparablecompator2;
public class ContaCorrente implements Comparable {
private int saldo;// = (int) 600.00;// casting

public int getSaldo() {
return saldo;
}

public void setSaldo(int saldo) {
this.saldo = saldo;
}

public int compareTo(ContaPoupanca contaPoupanca) {
if (getSaldo() == contaPoupanca.getSaldo()) {
System.out.println(“Saldos iguais”);
return 0; //Leia a documentação.
}

  if (getSaldo() > contaPoupanca.getSaldo()) {  
     System.out.println("Saldo dessa conta maior que o da recebida");  
     return 1;  
  }  
  System.out.println("Saldo dessa conta menor que o da recebida");  
  return -1;  

}

public static void main(String[] args) {
ContaPoupanca cp = new ContaPoupanca();
cp.setSaldo(100);
ContaCorrente cc = new ContaCorrente();
cc…setSaldo(50);
cc.compareTo(cp);
}
} [/code]

Em todo caso, é bom ler a documentação (aliás, já deve ser o quinto ou sexto tópico que te digo isso). O comparable indica se um objeto é igual, maior ou menor que outro. Não se os objetos são iguais ou diferentes. Teste de igualdade é feito pelo equals. A documentação também diz que o método deve retornar 0 (e não -1), quando os métodos forem iguais, >0 se o objeto em questão for maior que o recebido ou <0 caso contrário.

// Quando você usa "Comparable", normalmente é para comparar com a mesma classe,
// (ou seja, você só compara maçãs com maçãs, não com laranjas), não com outra
// classe. A menos que você tenha 2 classes que são derivadas de uma superclasse. 
// No seu caso, provavelmente você teria algo como:

public class Conta implements Comparable<Conta>  {  
   
     private int saldo;
   
     public int getSaldo() {  
         return saldo;  
     }  
   
     public void setSaldo(int saldo) {  
         this.saldo = saldo;  
     }  
   
     public int compareTo(Conta outraConta) {  
         if (getSaldo() == outraConta.getSaldo())
             return 0;
         else if (getSaldo() < outraConta.getSaldo())
             return -1;
         else
             return +1;
     }  
       
     public static void main(String[] args) {  
         ContaCorrente cc = new ContaCorrente();
         ContaPoupanca cp = new ContaPoupanca();
         cc.setSaldo (100);
         cp.setSaldo (200);
         if (cc.compareTo (cp) < 0) {
             System.out.println ("O saldo da conta corrente é menor que o da poupança.");
         } else if (cc.compareTo (cp) > 0) {
             System.out.println ("O saldo da conta corrente é maior que o da poupança.");
         } else {
             System.out.println ("Os saldos de ambas as contas são iguais.");
         }
     }  
 }  

class ContaCorrente extends Conta {
}

class ContaPoupanca extends Conta {
}

[quote=ViniGodoy] A documentação também diz que o método deve retornar 0 (e não -1), quando os métodos forem iguais, 1 se o objeto em questão for maior que o recebido ou -1 caso contrário.
[/quote]

A rigor, só é preciso que o número seja 0 se igual, menor que zero se menor, e maior que zero se maior.
Portanto, o teste deve sempre ser contra == 0 ou < 0 ou > 0. É que a implementação padrão de muitos "compareTo" é esse (0, -1, +1), mas nada impede que alguém simplesmente compare 2 inteiros, por exemplo, e retorne a diferença, como resultado de compareTo.
Se não houver overflow ou underflow, a diferença também funciona. (Infelizmente, como há esse risco de overflow ou underflow, na prática a diferença não é suficiente. )

[quote=entanglement][quote=ViniGodoy] A documentação também diz que o método deve retornar 0 (e não -1), quando os métodos forem iguais, 1 se o objeto em questão for maior que o recebido ou -1 caso contrário.
[/quote]

A rigor, só é preciso que o número seja 0 se igual, menor que zero se menor, e maior que zero se maior.
Portanto, o teste deve sempre ser contra == 0 ou < 0 ou > 0. É que a implementação padrão de muitos "compareTo" é esse (0, -1, +1), mas nada impede que alguém simplesmente compare 2 inteiros, por exemplo, e retorne a diferença, como resultado de compareTo.
Se não houver overflow ou underflow, a diferença também funciona. (Infelizmente, como há esse risco de overflow ou underflow, na prática a diferença não é suficiente. )[/quote]

Exatamente, não precisa ser exactamente 1 ou 1 apenas interessa como se compara com zero.
Contudo quero aproveitar para tambem sublinhar que a diferença (subtração) não pode ser usada por causa dos over e underflow. E especialmente comparando double e float nem o operador > e < deve ser usado. A implementação correta de um Comparable ou Comparator é muito mais complexa do que parece ao iniciante. (Ler efective java ajuda a entender o erro).

A moral da historia é : nunca use contas para implementar comparação.

E portanto, usar 1, 0, -1 é mais natural. Contudo, é bom sempre delegar a comparação aos tipos primitivos e no caso de double e float aos métodos compare dos respetivos wrappers.

Confesso que na hora pensei certo, mas estava com meu exemplo na cabeça, e acabei escrevendo tudo errado.

É uma boa ler esse tópico também:
http://www.guj.com.br/posts/list/54036.java#284273

Puxa vcs são dez em atenção e também em conhecimento… valeu mesmo…

abs, :smiley:
André AS