Problème avec la fontion CompareTo

Signaler
Messages postés
33
Date d'inscription
samedi 4 décembre 2010
Statut
Membre
Dernière intervention
31 mars 2016
-
Messages postés
15985
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
10 août 2020
-
Bonjour,

J'ai un message erreur du type NullPointerException provenant d'une méthode compareTO dont voici le code: en fait j'ai une classe Personne qui implémente l'interface Comparable dans laquelle il a fallut redéfinir la méthode. dans la classe Personne j'ai deux champs prives :nomPersonne et prenomPersonne

//plus haut dans ma classe j'ai :
private String nomPersonne;
private String prenomPersonne;


//plus bas dans la classe j'ai la méthode
@Override
public int compareTo(Object o){
String nomPer1 = "";
String prenomPer1= "";
if(this.getClass().equals(o.getClass())){
nomPer1 = ((Personne) o).getNomPersonne();
prenomPer1= ((Personne) o).getPrenomPersonne();

try{
if(nomPer1 .compareTo(this.nomCandidat) == 0){
return prenomPer1.compareTo(this.prenomCandidat);
}
return nomPer1 .compareTo(nomCandidat);
}catch(NullPointerException npe){}
}
return prenomPer1.compareTo(nomCandidat); //voici la ligne qui fait erreur
}

je ne comprends rien j'ai besoin d'un éclaircissement
Merci.

2 réponses

Messages postés
33
Date d'inscription
samedi 4 décembre 2010
Statut
Membre
Dernière intervention
31 mars 2016

je reviens poster le message erreur que voici:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.lang.String.compareTo(String.java:1142)
at cm.sygestenieg.entities.schoolacces.Candidat.compareTo(Personne.java:314)
at java.util.ComparableTimSort.binarySort(ComparableTimSort.java:258)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:203)
at java.util.Arrays.sort(Arrays.java:1244)
at java.util.Collections.sort(Collections.java:166) ....

Tout ce qui brille n'est pas or.
Messages postés
15985
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
10 août 2020
94
Bonsoir,

Elle est très bizarre ta méthode compareTo.

Déjà, pourquoi est-ce que l'argument est de type Object et pas de type Personne ?

De plus faire des try/catch(NullPointerException npe){} c'est masquer le problème, il vaut mieux vérifier chaque valeur en la comparant à null.

public class Personne implements Comparable<Personne> {

    private String nomPersonne;
    private String prenomPersonne;

    private final int orderIfStringNull = -1; // null est le plus petit String

    private int compare(String str1, String str2) {
        if (str1 == str2)
            return 0;
        if (str1 == null)
            return (str2 == null) ? 0 : orderIfStringNull;
        if (str2 == null)
            return -orderIfStringNull;
        return str1.compareTo(str2);
    }

    private final int orderIfPersonNull = -1; // null est la plus petite Personne

    @Override
    public int compareTo(Personne p) {
        if (this == p)
            return 0;
        if (p == null)
            return -orderIfPersonNull;
        int compareNomPersonne = compare(nomPersonne, p.nomPersonne);
        if (compareNomPersonne != 0)
            return compareNomPersonne;
        int comparePrenomPersonne = compare(prenomPersonne, p.prenomPersonne);
        if (comparePrenomPersonne != 0)
            return comparePrenomPersonne;
        return 0;
    }
}