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.
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, 
André AS