Comment attribuer à un Objet la valeur null ?

talbsbast Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   -  
talbsbast Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   -
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 :)

A voir également:

3 réponses

walidovich_85 Messages postés 608 Date d'inscription   Statut Membre Dernière intervention   73
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 53 Date d'inscription   Statut Membre Dernière intervention   1
 
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