O programa está entrada no erro de dizer que o ponto já exite e não está imprimindo o ToString… Poderiam me ajudar? o erro é NullPoint.
public static void main(String[] args) {
Scanner ler = new Scanner(System.in);
Ponto pontos[] = new Ponto[3];
Ponto existente[] = new Ponto[pontos.length];
for(int i = 0; i<pontos.length; i++) {
System.out.println("Insira um novo ponto \nx:");
int x = ler.nextInt();
System.out.println("y:");
int y =ler.nextInt();
Ponto p = new Ponto(x,y);
existente[i]=p;
if(existente[i]!=null) {
if(existente[i].equals(p)) {
System.out.println("Erro! Ponto já existe");
}else {
pontos[i] = p;
}
}
}
for(Ponto i : pontos) {
System.out.println(i.toString());
}
}
}
//Método toString e equals
public boolean equals(Ponto p) {
if (p.getX()==x && p.getY()==y) {
return true;
}
return false;
}
public String toString() {
String result = "x: “+ getX()+” y: "+getY();
return result;
}
}
Olha bem a lógica que você desenvolveu:
Ponto p = new Ponto(x, y);
existente[i] = p; // aqui você inseriu um Ponto != null na posição 'i'
if (existente[i] != null) { // esse 'if' é desnecessário, a posição 'i' sempre vai ser != de null, veja a linha anterior
if (existente[i].equals(p)) { // sempre vai entrar nesse 'if' pois na posição 'i' você acabou de inserir o objeto 'p'
System.out.println("Erro! Ponto já existe");
} else {
pontos[i] = p;
}
}
Outra coisa, veja seu método equals:
public boolean equals(Ponto p) {
if (p.getX() == x && p.getY() == y) { // o que vai acontecer se 'p' for null?
return true;
}
return false;
}
Eu reescreveria ele dessa forma, para de fato sobrescrever o método equals
e não criar um novo equals
com parâmetro diferente:
@Override
public boolean equals(Object o) {
if (o instanceof Ponto) {
Ponto p = (Ponto) o;
return p.getX() == this.getX() && p.getY() == this.getY();
}
return false;
}
Muito obrigado amigo, vou tentar dar uma otimizada.
Você me recomendaria algo para saber se o valor passado pelo usuario já está em um array?
Você só tem que pensar em executar as ações na ordem certa.
No código que você postou você estava primeiro inserindo o objeto no array para depois verificar se ele já estava inserido.
Você tem que verificar antes de inserir, veja:
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
Ponto pontos[] = new Ponto[3];
for (int i = 0; i < pontos.length; i++) {
System.out.print("Insira um novo ponto \nx: ");
int x = entrada.nextInt();
System.out.print("y: ");
int y = entrada.nextInt();
Ponto p = new Ponto(x, y); // cria o objeto com os parâmetros que o usuário informou
if (estaContido(p, pontos)) { // verifica se já existe no array
System.out.println("Erro! Ponto já existe"); // se existe, mostra mensagem
} else {
pontos[i] = p; // se não existe, insere no array
}
}
for (Ponto i : pontos) {
System.out.println(i.toString());
}
}
private static boolean estaContido(Ponto p, Ponto[] pontos) {
for (int i = 0; i < pontos.length; i++) {
if (p.equals(pontos[i])) {
return true;
}
}
return false;
}