IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Classe qui ne s'initialise pas


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut Classe qui ne s'initialise pas
    Bonjour !

    Je m'entraine sur Java pour les rattrapages qui sont dans quelques jours, et décidément j'ai toujours du mal a comprendre la logique de ce langage ...

    C'est un petit exo ou je dois creer une classe Point, puis une classe Segment.

    La classe Point:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class Point {
     
        private double x=0,y=0;
     
        public void Val(double xVal,double yVal){
            this.x=xVal;
            this.y=yVal;
        }
     
        public double getX(){
            //System.out.println(this.x);
            return this.x;
        }
     
        public double getY(){
            //System.out.println(this.y);
            return this.y;
        }
     
    }
    La classe segment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Segment {
     
        private Point p1,p2;
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
    }
    Lorsque je créer un point, il est bien initialisé directement par x=0 et y=0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Point B = new Point();
    System.out.println(B.getX());
    me donne bien 0.0

    Pourtant lorsque je crée un segment, les deux points ne s'initialise pas avec (0,0) ! Je ne comprend pas pourquoi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Segment S = new Segment();
    System.out.println(S.getPoint1().getX());
    me donne NullPointerException !

    Même si je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Segment S = new Segment();
    System.out.println(S.getPoint1());
    Ca me donne Null.

    Pourquoi ma classe segment de crée-t-elle pas directement des points de valeur (0.0) ??

    Si vous avez une idée, un grand merci

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    Salut,
    C'est parcequ'il nya pas d'initialisation par defaut dans ta classe

    Eric

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pour être plus précis, en Java un objet ne se crée qu'en faisant un new.

    Si tu veux que ta classe Segment crée des objets Point, tu dois faire des new Point(). Par défaut, aucun objet n'est créé et les variables sont donc null.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    D'accord du coup j'ai modifier ma classe Segment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Segment {
     
        Point p0 = new Point();
     
        private Point p1=this.p0,p2=this.p0;
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
    }
    Et ça fonctionne ! Mais je ne comprend pas, ma classe segment crée 2 points p1 et p2 d'après la classe point, alors pourquoi j'avais (0,0) lorsque je test la classe point, et "Null" lorsque je test la classe Segment ?

    Décidément je trouve java assez obscure dans sa façon de fonctionner ...

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    D'accord. Du coup un objet n'existe qu'après un new ... Donc une classe peut fonctionner avec des constructeurs "null" ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,


    Citation Envoyé par Xx-Astro Voir le message
    Et ça fonctionne ! Mais je ne comprend pas, ma classe segment crée 2 points p1 et p2 d'après la classe point, alors pourquoi j'avais (0,0) lorsque je test la classe point, et "Null" lorsque je test la classe Segment ?
    C'est parce que private Point p1, p2; ne fait que déclarer 2 variables p1 et p2 de type Point, mais ne créé aucun objet. Par défaut, une variable déclarée de type classe est initialisée à null (les variables de type primitif sont initialisées avec une valeur). C'est tout, c'est comme ça. C'est comme ajouter un numéro à une rue : il n'y a pas de maison qui apparait comme par magie toute seule, il faut en construire une.

    Accessoirement, ton code pourrait s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Segment {
     
        private Point p1=new Point(), p2=p1;
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
    }
    ça t'évite de créer un attribut p0 qui ne sert à rien.


    Citation Envoyé par Xx-Astro Voir le message
    Donc une classe peut fonctionner avec des constructeurs "null" ?
    On dit plutôt constructeur "vide", voir implicite ("vide" forcément).

    Constructeur vide implicite (on ne voit pas de constructeur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Machin {
        private String string;
    }
    Constructeur vide explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Truc {
        private String string;
        public Truc() {
        }
    }
    Quant à fonctionner, ça dépend. On peut faire une classe avec des attributs non initialisés. Mais elle peut ne pas fonctionner s'il y a du code qui essaye de faire quelque chose avec ses attributs non initialisés.

    La classe suivante ne pourra être instanciée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class NonInstanciable {
     
        private String string;
    	private int nombreDeMots;
     
       public NonInstanciable() {
          nombreDeMots = string.split("\\s+").length;
       }
     
       public String getString() {
           return string;
       }
     
       public int getNombreDeMots() {
          return nombreDeMots;
       }
     
    }
    Parce que string n'est pas initialisée, elle vaut null. Donc quand on appelle split() sur string, on obtient une NullPointerException.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    D'accord, je vois.

    Alors j'ai modifié a nouveau mon code pour mettre des constructeurs a chaque fois.
    La classe Point fonctionne. La classe segment fonctionne aussi, sauf si je remplace le contenu du constructeur par ce qui est en commentaire ... Ca me donne encore un "NullPointerException"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class Point {
     
        public double x,y;
     
        public Point(){
            this.x=0;
            this.y=0;
        }
     
        public void setPoint(double xVal,double yVal){
            this.x=xVal;
            this.y=yVal;
        }
     
        public double getX(){
            return this.x;
        }
     
        public double getY(){
            return this.y;
        }
     
        public double getDistance(Point p1){
            return Math.sqrt(Math.pow((this.x-p1.getX()), 2)+Math.pow((this.y-p1.getY()), 2));
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class Segment {
     
        public Point p1, p2;
     
        public Segment(){
            Point p0=new Point();
            this.p1 = p0;
            this.p2 = p0;
    //        this.p1.setPoint(0,0);
    //        this.p2.setPoint(0,0);
        }
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
     
        public void affichage(){
            System.out.println("1er point: " + "x=" + this.p1.getX() + "  " + "y=" + this.p1.getY());
            System.out.println("2eme point: " + "x=" + this.p2.getX() + "  " + "y=" + this.p2.getY());
        }
     
        public double getLongueur(){
            return this.p1.getDistance(this.p2);
        }
    }
    Mais pourquoi ? Les trois lignes de codes, et les deux en commentaire m'ont l'air équivalente !

    PS: j'ai tout passé en public car je ne savait d'ou venait l'erreur ... Je modifiais ça après.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    Ah ok je viens de comprendre en postant ... p1 et p2 n'existent pas tant qu'il n'y a pas de new ... Mais alors pour quoi je peux utiliser x et y dans la classe Point sans faire de new ??!

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/09/2006, 15h48
  2. class qui ne marche pas
    Par RaphAstronome dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2006, 20h00
  3. [POO] Methode de classe qui ne s'exécute pas
    Par gregal dans le forum Langage
    Réponses: 2
    Dernier message: 11/04/2006, 11h01
  4. [CSS]Classe qui ne s'applique pas
    Par narnou dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 17/03/2006, 14h11
  5. class qui ne s'applique pas sous opéra pour les <tr>?
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/03/2006, 16h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo