Comment attribuer à un Objet la valeur null ?

Fermé
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 - 25 mars 2014 à 16:21
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 - 25 mars 2014 à 19:07
Bonjour,

j'ai créé une classe de points :
public class Point {
public long x;
public long y;

public Point(long a, long b){
x = a;
y = b;
}

public void Affiche(boolean b){
if(this == null)
System.out.println("Infini");
else{
if(b)
System.out.println("("+ x +" , "+ y +")");
else
System.out.print("("+ x +" , "+ y +") ");
}
}
}

j'ai un point (à l'infini) dans mon ensemble, à qui je ne peux pas attribuer des valeurs pour ne pas le confondre avec les points ordinaires

du coup je lui attribue null
dans mon main je mis
Point R = null;
mais ça bug !

des idées SVP ? Merci :)

3 réponses

walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 25/03/2014 à 18:29
Bonsoir,

D'abord, vous ne pouvez pas appliquer des méthodes à un objet null. Il faut l'instancier.

Alors, if (this==null) est inutile, car la fonction ne sera pas appelé pour un objet null, le compilateur ne va pas le permettre; et même si vous y arriverez, la JVM va générer NullPointerException à l'exécution (peut être c ça ce que vous voulez dire par "ça bug")

PS:
- la fonction affiche() donne le même résultat quoi que soit la valeur de l'entrée b.
- est que l'ajout d'un attribut boolean "infini" à la classe Point ne va résoudre votre problème?

Bonne chance

Being normal is boring... being geek is interesting
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 mars 2014 à 18:32
Ce que tu manipules dans tes variables ce ne sont pas directement les objets mais des références aux objets. La valeur null signifie que la variable ne référence aucun objet. Mais quand tu manipules une méthode c'est toujours avec un objet, donc sa référence existe, tu ne peux donc jamais avoir this==null

Tu peux peut être te créer des constantes static de type Point et faire une comparaison des objets avec == (et non pas equals comme d'habitude) afin de savoir si l'objet que tu référence est une de ces constantes.
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 25/03/2014 à 19:05
Un exemple rapide (avec les 8 cas d'infinis possibles).

public class Point
{
    public static final Point INFINITE_XP = new Point(Long.MAX_VALUE, 0);
    public static final Point INFINITE_XP_YP = new Point(Long.MAX_VALUE, Long.MAX_VALUE);
    public static final Point INFINITE_XP_YN = new Point(Long.MAX_VALUE, Long.MIN_VALUE);
    public static final Point INFINITE_XN = new Point(Long.MIN_VALUE, 0);
    public static final Point INFINITE_XN_YP = new Point(Long.MIN_VALUE, Long.MAX_VALUE);
    public static final Point INFINITE_XN_YN = new Point(Long.MIN_VALUE, Long.MIN_VALUE);
    public static final Point INFINITE_YP = new Point(Long.MAX_VALUE, 0);
    public static final Point INFINITE_YP_XP = INFINITE_XP_YP;
    public static final Point INFINITE_YP_XN = INFINITE_XN_YP;
    public static final Point INFINITE_YN = new Point(Long.MIN_VALUE, 0);
    public static final Point INFINITE_YN_XP = INFINITE_XP_YN;
    public static final Point INFINITE_YN_XN = INFINITE_XN_YN;
    
    public static boolean isXPositiveInfinite(Point point)
    {
        return point == INFINITE_XP || point == INFINITE_XP_YP || point == INFINITE_XP_YN;
    }
    
    public static boolean isXNegativeInfinite(Point point)
    {
        return point == INFINITE_XN || point == INFINITE_XN_YP || point == INFINITE_XN_YN;
    }
    
    public static boolean isYPositiveInfinite(Point point)
    {
        return point == INFINITE_YP || point == INFINITE_YP_XP || point == INFINITE_YP_XN;
    }
    
    public static boolean isYNegativeInfinite(Point point)
    {
        return point == INFINITE_YN || point == INFINITE_YN_XP || point == INFINITE_YN_XN;
    }
    
    public static boolean isXInfinite(Point point)
    {
        return isXPositiveInfinite(point) || isXNegativeInfinite(point);
    }
    
    public static boolean isYInfinite(Point point)
    {
        return isYPositiveInfinite(point) || isYNegativeInfinite(point);
    }
    
    public static boolean isInfinite(Point point)
    {
        return isXInfinite(point) || isYInfinite(point);
    }
    
    public final long x;
    public final long y;
    
    public Point(long a, long b)
    {
        x = a;
        y = b;
    }
    
    public void affiche(boolean println)
    {
        if (println)
            System.out.println(this);
        else
            System.out.print(this + " ");
    }
    
    @Override
    public String toString()
    {
        if (isInfinite(this))
            return "Infini";
        else
            return String.format("(%d, %d)", x, y);
    }
}

Perso j'irais plus loin pour optimiser, mais là c'est déjà un bon point de départ...
0
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 1
25 mars 2014 à 19:07
walidovich_85
Merci pour votre réponse, Le boolean b c'est juste pour faire un retour à la ligne après l'affichage ou pas.

KX
Merci encore une fois pour votre aide :) j'ai créé une méthode static et ça a résolu mon problème.
0