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 :

Problème avec this.(a[0],a[1])


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2013
    Messages : 23
    Points : 28
    Points
    28
    Par défaut Problème avec this.(a[0],a[1])
    bonjour,
    je suis entrain de me familiariser avec Java. Je n'arrive pas a comprendre le probleme suivant lie a this:
    J'ai trois constructeurs:

    #1 A() ou les membres prennent la valeur par defaut:
    public A(){this(0,0);} // appel du constructeur #2

    #2 A(int x, int y) ou j'affecte les valeurs aux membres de la classe
    public A(int x, int y){this.x=x; this.y=y;}

    #3- A(int[] a) ou j'affecte les valeurs aux membres a partir des valeurs de a[0] et a[1] (pointe egalement vers le constructeur #2):
    public A(int[] a){this(a[0],a[1]);}

    Je ne comprends pas pourquoi des trois constructeur suivants, la troisieme approche ne fonctionne pas si j'invoque explicitement this alors qu'il marche dans #1 ou je fais explicitement this(0,0).

    Je sais que je peux faire simple, mais je souhaiterais comprendre mon erreur ici.
    Certainement le probleme est basique, mais je ne vois pas.
    Merci d'avance.
    J'utilise Java7

  2. #2
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    que veux tu dire par "ne fonctionne pas" ?

    As tu une erreur de compilation quelque part et laquelle et ou ? Ou une Exception à l'exécution , laquelle et ou ? (stacktrace).

    Ton constructeur 3 est tout à licite. Le code suivante par exemple fonctionne et affiche bien 10,20

    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 int y;
    	private int x;
     
    	public Point(){this(0,0);} 
     
    	public Point(int x, int y){this.x=x; this.y=y;}
     
    	public Point(int[] a){this(a[0],a[1]);}
     
    	@Override
    	public String toString() {
    		return x+","+y;
    	}
     
    	public static void main(String[] args) {
    		System.out.println(new Point(new int[]{10,20}));
    	}
     
    }
    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.

  3. #3
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par nabil.g Voir le message
    #3- Point(int[] a) ou j'affecte les valeurs aux membres a partir des valeurs de a[0] et a[1] (pointe egalement vers le constructeur #2):
    public A(int[] a){this(a[0],a[1]);}
    Bonjour,
    je ne crois pas que Point() comme décrit ci haut soit un constructeur de la classe A. Le constructeur porte toujours le même nom que sa classe. Essaie de changer Point en A.
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2013
    Messages : 23
    Points : 28
    Points
    28
    Par défaut
    salut, merci pour vos reponses. J'avais dans un souci de simplification remplace Point par A lors de la redaction de mon message.
    J'ai corrige la question initiale. L'appel du constructeur A(int x,int y) par le constructeur A(int[] p){this(p[0],p[1]);} ne compile pas dans Eclipse (4.3, Java7), ce qui ne me permet alors pas de l'executer.
    Eclipse m'indique comme message d'erreur que le constructeur doit etre place en premier
    "Constructor call must be the first statement in a constructor"

    je mets en piece jointe le snapshot associe qui montre le message d'erreur.
    Sur certains forums, en recherchant "Constructor call must...", il est simplement dit qu'il faut eviter l'encapsulation, mais ca ne repond pas a ma question. Je continue de chercher.
    merci.
    Images attachées Images attachées  

  5. #5
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nabil.g Voir le message
    salut, merci pour vos reponses. J'avais dans un souci de simplification ... Je continue de chercher.
    merci.
    En effet, le code indiqué dans ta question n'était pas le code réel que tu n'arrivais pas faire fonctionner.

    L'erreur que tu obtiens indique tu cherches à faire quelque chose qui est proscrit en java, avoir du code entre le début du constructeur et l'invocation du constructeur du parent, ou le constructeur this(...) :
    - dans certains cas, ou on veut traiter les paramètres du constructeur, c'est génant, mais on peut s'en sortir en faisant une méthode private static qui fait ce traitement ;
    - par contre, on peut comprendre qu'on ne peut pas appeler des méthodes de la classe elle-même, celle ci n'existant pas vraiment encore tant que son constructeur n'est pas entièrement exécuté, donc forcément pas avant qu'on l'appelle

    Donc dans ton constructeur,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Point(int[] a){
    if (a.length!=2 )  throw new IllegalArgumentException("wrong dimension");
    setX(a[0]);
    setY(a[1]);
    n++;
    this(a[0],a[1]);
    }
    Le code en rouge ne sert à rien, puisque rendondant par rapport au code du constructeur Point(int, int).

    Le code en bleu peut être remplacé comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Point(int[] a){
    this(firstArgument(a),a[1]);
    }
    private static int firstArgument(int[] a) {
    if (a.length!=2 )  throw new IllegalArgumentException("wrong dimension");
    return a[0];
    }
    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.

  6. #6
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par nabil.g Voir le message
    Eclipse m'indique comme message d'erreur que le constructeur doit etre place en premier
    "Constructor call must be the first statement in a constructor"
    Oui c'est ce que tu dois faire. appelle cette instruction en premier lieu à l'intérieur de ton constructeur...
    D'ailleurs le code de joel.drigo résoudra parfaitement ton blem. Néanmoins si tu as de soucis à le comprendre on pourra t'expliquer comment ça marche
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2013
    Messages : 23
    Points : 28
    Points
    28
    Par défaut
    Merci pour la clarification! J'aurais du simplifier le code avant d'envoyer le snapshot de l'editeur Eclipse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public Point(int[] a) throws IllegalArgumentException {
    if (a.length != 2) throw new IllegalArgumentException("wrong dimension");
    this(a[0],a[1]); 
    }
    plante car il y'a du code avant l'appel explicite a this. Effectivement je comprends maintenant qu'appeler est assez contraint.
    Merci pour la clarification.

  8. #8
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    cool
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2014, 08h39
  2. Problème avec le this en java
    Par sachou19 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 01/05/2014, 17h31
  3. problème avec this/super
    Par Scronchh dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 03/09/2010, 20h18
  4. Petit problème avec this
    Par Jobard81 dans le forum Langage
    Réponses: 7
    Dernier message: 16/02/2009, 14h08
  5. [POO] Problème avec $this de PHP4 à PHP5
    Par c4l3m dans le forum Langage
    Réponses: 19
    Dernier message: 16/02/2007, 09h48

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