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

Langage Java Discussion :

[java1.5] Danger de la boucle for(Object o : objects)


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut [java1.5] Danger de la boucle for(Object o : objects)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void test(){
            String[] string = new String[2];
            for (String s : string){
                s = "test";
            }
            for (int i = 0; i < string.length; i++) {
                System.out.println("string " + i + " = " + string[i]);
            }
        }
    Ce code va renvoyer dans la console :

    string 0 = null

    string 1 = null


    Je n'avais jamais rencontré ce probleme avec java1.5 avant (car tres peu utilisé), mais c'est bien ennuyeux tout de meme.

    Une petite question au passage, il y a t'il un moyen de pointer vers une variable a null ?

  2. #2
    Invité
    Invité(e)
    Par défaut comprends pas...
    Je ne comprends pas...
    qui signifie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (String s : string){
    ?
    septentryon

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Il s'agit d'une nouvelle synthaxe du for utlisé avec une collection, cela provient du jdk 5.0

    Quand a ton code oui c'est bizare, mais cela doit etre du au fait que s est une variable local...

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    J'ai trouvé ca bizare a premiere vue aussi, mais en y reflechissant, il est créé une variable local s, qui pointe vers un element du tableau string, qui lui est a nulle, donc la varaible s et l'élément du tableau sont tous les 2 a null, mais n'ont aucun liens entre eux.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    C'est plutot genant meme en fait c'est assez simple, tu a le droit d'appeler des fonctions avec une telle boucle for neanmoins tu ne peux reaffecter les cases memeoires du tableau...
    en fait s pointe vers la case memoire du tableau
    mais quand on fait s = "string";
    s pointe vers une nouvelle instance de String contenant "string" mais cela ne change pas la case memoire du tableau...

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Points : 11 101
    Points
    11 101
    Par défaut Re: [java1.5] Danger de la boucle for(Object o : objects)
    Citation Envoyé par barksy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void test(){
            String[] string = new String[2];
            for (String s : string){
                s = "test";
            }
            for (int i = 0; i < string.length; i++) {
                System.out.println("string " + i + " = " + string[i]);
            }
        }
    Ce code va renvoyer dans la console :

    string 0 = null

    string 1 = null


    Je n'avais jamais rencontré ce probleme avec java1.5 avant (car tres peu utilisé), mais c'est bien ennuyeux tout de meme.
    Mais c'est un comportement tout à fait logique.
    C'est comme si tu avais écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void test(){
            String[] string = new String[2];
            for (int i=0; i< string.length;i++){
                String s = string[i];
                s = "test";
            }
            for (int i = 0; i < string.length; i++) {
                System.out.println("string " + i + " = " + string[i]);
            }
        }
    Et là, tu te rends bien compte que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = string[i];
    s = "test";
    N'est pas du tout la même chose que
    Une petite question au passage, il y a t'il un moyen de pointer vers une variable a null ?
    Pas sûr de comprendre la question, mais si c'est ce genre de chose que tu veux dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s1 = null;  //variable s1 pointe vers une valeur null
    String s2 = s1; //variable s2 pointe également sur null
    alors la réponse est oui.
    Vincent Brabant

    Ne pas me contacter par MP ni par mail pour des questions techniques. Ma liste d'amis restera vide.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut Re: [java1.5] Danger de la boucle for(Object o : objects)
    Citation Envoyé par barksy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void test(){
            String[] string = new String[2];
            for (String s : string){
                s = "test";
            }
            for (int i = 0; i < string.length; i++) {
                System.out.println("string " + i + " = " + string[i]);
            }
        }
    Ce code va renvoyer dans la console :

    string 0 = null

    string 1 = null


    Je n'avais jamais rencontré ce probleme avec java1.5 avant (car tres peu utilisé), mais c'est bien ennuyeux tout de meme.

    Une petite question au passage, il y a t'il un moyen de pointer vers une variable a null ?
    il faudrait que tu revois tes cours de Java les String sont immutable non mais!!!!!

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Oui j'viens de m'en rendre compte en en parlant avec un ami. Désolé.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    c pas grave, on est tous la pour apprendre ... et heureusement
    N oublie pas le tag resolu

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Points : 11 101
    Points
    11 101
    Par défaut Re: [java1.5] Danger de la boucle for(Object o : objects)
    Citation Envoyé par SEMPERE Benjamin
    il faudrait que tu revois tes cours de Java les String sont immutable non mais!!!!!
    Excuse moi Benjamin, mais cela n'a rien à voir avec le fait que les String soient immutables ou pas. Avec n'importe quel tableau d'objets, la deuxième boucle donnera toujours null.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            Date[] dates = new Date[2];
            for (Date d : dates) {
                System.out.println("d: "+d);
                d = new Date();
                System.out.println("d: "+d);
            }
            for (int i = 0; i < dates.length; i++) {
                System.out.println("Date " + i + " = " + dates[i]);
            }
    donne également null. Or date n'est pas une classe immutable, comme l'est String.

    cfr mon explication.
    Vincent Brabant

    Ne pas me contacter par MP ni par mail pour des questions techniques. Ma liste d'amis restera vide.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut Re: [java1.5] Danger de la boucle for(Object o : objects)
    Citation Envoyé par vbrabant
    Citation Envoyé par SEMPERE Benjamin
    il faudrait que tu revois tes cours de Java les String sont immutable non mais!!!!!
    Excuse moi Benjamin, mais cela n'a rien à voir avec le fait que les String soient immutables ou pas. Avec n'importe quel tableau d'objets, la deuxième boucle donnera toujours null.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            Date[] dates = new Date[2];
            for (Date d : dates) {
                System.out.println("d: "+d);
                d = new Date();
                System.out.println("d: "+d);
            }
            for (int i = 0; i < dates.length; i++) {
                System.out.println("Date " + i + " = " + dates[i]);
            }
    donne également null. Or date n'est pas une classe immutable, comme l'est String.

    cfr mon explication.
    Effectivement tu as raison
    Tu modifies uniquement la reference de d dans la premiere boucle!!
    Peut etre devrais je arreter la .... lol ou peut etre prendre plus le temps de lire les posts je l avoue...

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Je vais me permettre de te contester. Ta remarque est pertinente car
    equivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = new String("string");
    Mais dans le cas ou cela serait equivalent à
    Citation Envoyé par pseudoCode
    s.setText("string");
    Le code initial serait valable donc ca a plus ou moins un raport avec le fait que les String soient immutables..
    J'espere que je suis claire

    PS : On est d'accord sur l'essentiel, juste la vision des choses differe..

    Edit : Pourquoi mes posts sont toujours précédés a quelques minutes près par un nouveau post?

  13. #13
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    oui, mais ce n'est pas du tout pareil de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      x = y; // à remplacer par tout ce qu'on veut x = new X(); ...
    et

    dans le premier cas tu affectes une nouvelle valeur à x, donc x est modifié (pour peu que y soit différent de x bien sûr) alors que dans le second, tu modifies une des caractéristiques de l'objet x, la valeur de x n'est pas elle-même modifiée (la valeur de x avant et après le set() est la même).

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par herve91
    oui, mais ce n'est pas du tout pareil de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      x = y; // à remplacer par tout ce qu'on veut x = new X(); ...
    et

    dans le premier cas tu affectes une nouvelle valeur à x, donc x est modifié (pour peu que y soit différent de x bien sûr) alors que dans le second, tu modifies une des caractéristiques de l'objet x, la valeur de x n'est pas elle-même modifiée (la valeur de x avant et après le set() est la même).
    Il y a tout de meme une exception a souligner pour les chaines
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String s = "toto";
    String s2 = "toto";
     
    //s1 == s2 => true
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String s = new String("toto");
    String s2 = new String("toto");
     
    //s1 == s2 => false
    Enfin c une remarque a titre informatif

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    On est d'accord mais les String sont des Object particulier puisqu'ils ont une synthaxe propre à eux-meme, je voulais juste souligner cela... Cette synthaxe se rapproche de celle utilisée avec les types primitifs mais il ne fait pas oublier que avant tout les String sont des Object et que la synthaxe (de facon implicite) les fait fonctionner exactement comme tout Object.

    Edit : hormis le fait souligner par SEMPERE Benjamin

  16. #16
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Merci mais je ne vois pas bien le rapport avec ma remarque sur la différence entre l'affectation et l'appel à une méthode set()..

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par herve91
    Merci mais je ne vois pas bien le rapport avec ma remarque sur la différence entre l'affectation et l'appel à une méthode set()..
    Ben c t une precision sur le mot different(ce que l on entend a travers ce mot) dans le contexte associe au chaines de caracteres

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  18. #18
    Expert éminent sénior


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Points : 11 101
    Points
    11 101
    Par défaut
    En tout cas, si tu le permet, je reprendrai cet exemple pour les fiches défi concernant la certification Java. Car il est vraiment excellent.

    D'avance merci.
    Vincent Brabant

    Ne pas me contacter par MP ni par mail pour des questions techniques. Ma liste d'amis restera vide.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  19. #19
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 303
    Points : 201
    Points
    201
    Par défaut

    Il y a tout de meme une exception a souligner pour les chaines
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String s = "toto";
    String s2 = "toto";
     
    //s1 == s2 => true
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String s = new String("toto");
    String s2 = new String("toto");
     
    //s1 == s2 => false
    Enfin c une remarque a titre informatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = new String("toto");
    crée un objet qui vaudrat tjs "toto" et 's' est une variable qui le designe et capable de capter un autre objet, par exemple en l'affectant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String s2 = new String("toto");
    ici s2 designe l'objet chaine "toto" qui n'a aucun lien avec l'objet designe par s, c'est ce qui explique que s == s2 rend faux, car il compare 2 objets distincts qui designent chacun un objet "toto"
    s et s2 designent desormais le meme objet qui est la chaine "toto" et donc s == s2 rend vrai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = "toto";
    String s2 = "toto";
    ici s et s2 vallent la chaine "toto" et donc s == s2 equivaut à la comparaison du contenu de s et s2 et donc rend vrai

  20. #20
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par vbrabant
    En tout cas, si tu le permet, je reprendrai cet exemple pour les fiches défi concernant la certification Java. Car il est vraiment excellent.

    D'avance merci.
    Merci a toi aussi de corriger mes erreurs

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

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

Discussions similaires

  1. Modifier le nom d'un object(boucle for)
    Par Ment0r dans le forum C#
    Réponses: 2
    Dernier message: 20/11/2011, 14h41
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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