Java.lang.NullPointerException sur un attribut d'un objet statiq

Résolu/Fermé
YoMan! - Modifié par KX le 31/12/2014 à 07:28
YoMan! Messages postés 3 Date d'inscription mercredi 31 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014 - 31 déc. 2014 à 10:43
Bonjour,

Pour un projet de simulation de salon de coiffure, j'ai à créer des objets statiques de coiffeurs dans le moniteur auquel j'accède depuis les évènements pour changer leurs valeurs au cours de la simulation. Le problème c'est qu'en essayant d'accéder à la valeur d'un des attribut d'un coiffeur, j'ai eu droit à java.lang.NullPointerException.

Voici des extraits de mon code :

public class Coiffeur{
 ...
 private LogicalDateTime nextAvailability = new LogicalDateTime("05/01/2015 09:00:00.0");
        ...
        public boolean isSoonAvailable(LogicalDateTime start) {  
  return nextAvailability.soustract(start).compareTo(LogicalDuration.ofMinutes(20)) <= 0;
 }
}

public class EventArriveeClient extends SimEvent{
    //...
    public void Process(){ 
        ....
        if(client.favori==Client.Favori.NONE){
   if(Monitor.Lumpy.isSoonAvailable(start)) client.favori=Client.Favori.LUMPY;
                        .....
                        .....
        }
    }
}

public class Monitor {
    ....
    public static Coiffeur Lumpy = new Coiffeur("Lumpy");
    ....
    .. main ..
}


Voilà a quoi ressemble un peu mon code. Je peux pas tout copier mais n'hésitez pas à me poser des questions.

Merci d'avance pour votre aide !

PS: Petite précision, le debugger me signal que c'est pas seulement la valeur retournée par isSoonAvailable qui est nulle mais carrément nextAvaibility !!

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
31 déc. 2014 à 07:33
Bonjour,

Avec ton code partiel on ne peut pas faire grand chose, tu dis que nextAvaibility est null, c'est donc que tu as changé sa valeur après sa création.

Remarque : lorsqu'une exception est levée, la trace de la pîle d'appel permet d'identifier sur quelles lignes de code ça plante, cette information est très utile pour corriger.
1
YoMan! Messages postés 3 Date d'inscription mercredi 31 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014
31 déc. 2014 à 09:47
La ligne de code qui plante est le return de isSoonAvailable et il ne va pas plus loin.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
31 déc. 2014 à 10:06
Je ne connais pas cette classe LogicalDateTime, mais les raisons d'un NullPointerException peuvent être :

nextAvailability==null, dans ce cas ça veut dire qu'il a été modifié depuis son constructeur (ligne 3)
S'il est normal que nextAvailability puisse prendre la valeur null alors il faut faire un if pour tester ce cas afin de ne pas faire d'appel de méthodes derrière.

soustract(start)==null, je ne sais pas comment fonctionne la méthode soustract, mais il est possible qu'elle renvoie null, là aussi il faut tester le cas pour être complet.

public boolean isSoonAvailable(LogicalDateTime start) {
    if (start==null)
        return ?; // ou throw new IllegalArgumentException ou autre
    if (nextAvailability==null)
        return ?; // ou throw new IllegalStateException ou autre
    ? x = nextAvailability.soustract(start);
    if (x==null)
        return ?; // ou throw new ArithmeticException ou autre
    ? y = LogicalDuration.ofMinutes(20);
    if (y==null)
        return ?; // ou throw new ArithmeticException ou autre
    return x.compareTo(y) <= 0;
 }

Remarque : il faut généralement éviter ce que l'on appelle les "valeurs magiques" comme ton 20 ici.
Il vaut mieux mettre cette valeur dans une constante ou dans un paramètre, voir les deux.

private static final int DEFAULT_DELAY = 20; // mn

? boolean isSoonAvailable(LogicalDateTime start, int delayInMinutes) {
    ...
    ? y = LogicalDuration.ofMinutes(delayInMinutes);
    ...
}

public boolean isSoonAvailable(LogicalDateTime start) {
    return isSoonAvailable(start, DEFAULT_DELAY);
}
0
YoMan! Messages postés 3 Date d'inscription mercredi 31 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014
31 déc. 2014 à 10:36
Merci beaucoup KX pour votre aide ! J'ai finalement trouvé le problème: En fait, dans le moniteur, les valeurs statiques t0 et tf sont déclarées après la création des objets coiffeurs qui utilisent ces valeurs statiques dans leur constructeur.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > YoMan! Messages postés 3 Date d'inscription mercredi 31 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014
31 déc. 2014 à 10:39
Le genre de choses que l'on ne peut pas deviner avec ton code partiel qui ne mentionnait ni t0, ni tf...
0
YoMan! Messages postés 3 Date d'inscription mercredi 31 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014
31 déc. 2014 à 10:43
C'est vrai mais y avait tellement de lignes de code, je ne pouvais pas tout copier..
0