Problema para verificar se um objeto já está contido no array

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. :slightly_smiling_face:

Você me recomendaria algo para saber se o valor passado pelo usuario já está em um array?:thinking:

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;
}

Entendi, muito obrigado.:slightly_smiling_face:

1 curtida