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 :

Variables locales : might not have been initialized


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut Variables locales : might not have been initialized
    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
    class Tableau{
     
        int[]tab;
        int tailleTableau;
    void  min(){
        int [] temp; 
     
        for(int i=0;i<tailleTableau;i++){
       temp=new int[tailleTableau];
    temp[i]=tab[i];    
    }
    int tp=0;  
    for(int k=0;k<tailleTableau-1;k++){    
     
    	    if(temp[k]>temp[k+1]){
    		tp=temp[k+1];
    	    }
    	    else{
    tp=temp[k];
    temp[k+1]=temp[k];
    	    }
    	   }
    System.out.println("\n"+"minimum="+ tp);	
    }
    }
    Je déclare la variable int[] temp à l'entrée de la méthode min() et je crée l'objet temp =new int[tailleTableau] dans un sous bloc de méthode min(), je me dis que temp déclarée à l'entrée de la méthode a aussi sa portée dans le sous-bloc. Mais quand je compile, la machine me dit:" temp might not been initialized". Mais quand je fais int[] temp=new int[tailleTableau] (voir classe cidessous) , il se se pose aucun soucis. Je n'arrive pas à m'expliquer cette différence.


    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
    class Tableau{
     
        int[]tab;
        int tailleTableau;
    void  min(){
        int [] temp=new int[tailleTableau]; 
     
    for(int i=0;i<tailleTableau;i++){
     
           temp[i]=tab[i];    
    }
     
     
        int tp=0;  
    for(int k=0;k<tailleTableau-1;k++){    
     
    	    if(temp[k]>temp[k+1]){
    		tp=temp[k+1];
    	    }
    	    else{
    tp=temp[k];
    temp[k+1]=temp[k];
     
    	    }
     
     
     
    }
    System.out.println("\n"+"minimum="+ tp);	
    }
    }

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Hello,

    rien ne garantit que ce sous-bloc sera exécuté.

    Il s'agit d'une boucle for, qui s'arrête dès que i est inférieur à tailleTableau. i commence à zéro et rien au monde n'empêche tailleTableau d'être à zéro ou moins dès le début. Dans ce cas il n'y a aucune itération de la boucle et la variable temp n'a jamais été initialisée. Le compilateur a simplement raison.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Hello,

    rien ne garantit que ce sous-bloc sera exécuté.

    Il s'agit d'une boucle for, qui s'arrête dès que i est inférieur à tailleTableau. i commence à zéro et rien au monde n'empêche tailleTableau d'être à zéro ou moins dès le début. Dans ce cas il n'y a aucune itération de la boucle et la variable temp n'a jamais été initialisée. Le compilateur a simplement raison.
    Bonjour thelvin, C'était une erreur d’inattention. J'ai finalement remplacé tailleTableau par tailleTableau-1, j'ai toujours le même message d'erreur "variable temp might not have been initialized"

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Ben, parce que la situation est toujours la même. tailleTableau-1 pourrait parfaitement être à zéro ou moins dès le début.

    De toute façon, à partir du moment où tu fais une boucle for ou while*, elle pourrait très bien ne jamais s'exécuter parce que sa condition ne serait jamais vraie. Donc, tu ne peux pas te contenter d'instancier tes variables seulement dans cette boucle, car alors il y a risque que la variable n'ait pas été initialisée.

    * Par contre, dans un bloc do ... while, on sait qu'il s'exécutera au moins une fois, le problème ne se pose donc pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ben, parce que la situation est toujours la même. tailleTableau-1 pourrait parfaitement être à zéro ou moins dès le début.

    De toute façon, à partir du moment où tu fais une boucle for ou while*, elle pourrait très bien ne jamais s'exécuter parce que sa condition ne serait jamais vraie. Donc, tu ne peux pas te contenter d'instancier tes variables seulement dans cette boucle, car alors il y a risque que la variable n'ait pas été initialisée.

    * Par contre, dans un bloc do ... while, on sait qu'il s'exécutera au moins une fois, le problème ne se pose donc pas.
    Merci thelvin, j'ai bien compris.
    Pour résumer, si tailleTableau=0 la condition pour rentrer dans la boucle for ne sera pas vérifiée et dans ce cas la variable temp ne sera pas initialisée à l'interieur de la boucle for. Le compilateur me dit donc : "mon cher étant donné que la boucle for ne fonctionne pas dans tous les cas mieux vaut ne pas initialiser ta variable à l’intérieur de cette boucle sinon il pourra arriver que ton objet ne soit pas initialisé".
    C'est une aide considérable. Ça m'a permis de comprendre le fonctionnement d'un compilateur. Il regarde tous les risques possibles. C'est quelque chose qui est bien construit.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par cherche_java Voir le message
    C'est une aide considérable. Ça m'a permis de comprendre le fonctionnement d'un compilateur. Il regarde tous les risques possibles. C'est quelque chose qui est bien construit.
    C'est magique le compilateur

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Pour information, le compilateur ne fait pas ça rien que pour aider au développement.

    Si la variable n'a pas été initialisée dans tous les cas, il n'est en effet pas en mesure de transformer le code Java en classe compilée. Il doit calculer à quoi correspond la variable à utiliser, et on ne peut pas calculer ça si on ne sait pas où sont les possibles instanciations de cette variable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Pour information, le compilateur ne fait pas ça rien que pour aider au développement.

    Si la variable n'a pas été initialisée dans tous les cas, il n'est en effet pas en mesure de transformer le code Java en classe compilée. Il doit calculer à quoi correspond la variable à utiliser, et on ne peut pas calculer ça si on ne sait pas où sont les possibles instanciations de cette variable.
    Merci infiniment thelvin

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Bonsoir à tous,
    Je me pose des questions sur la classe suivante class Variablelocale. Elle compile sans que le compilateur ne me demande d'initialiser la variable e.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Variablelocale{
        public static void main(String args[]){
    	int e;
        }
    }

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Mais il fait un warning te disant qu'elle n'est jamais utilisée.
    Si tu ne te sers pas de cette variable il n'y a pas spécialement de contradiction, il a jamais besoin de savoir où sont ses initialisations. Par contre elle ne sert à rien.

    La règle est simple : on n'a le droit de commencer à utiliser une variable, qu'après être tombé sur un point où on est sûr qu'elle a été initialisée. Avant ce point, on peut l'initialiser où on veut et autant de fois qu'on veut.
    On ne tombe jamais sur un tel point, mais on ne tombe jamais sur une utilisation non plus. La règle est donc respectée, ou plus exactement elle ne se pose jamais.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Mais il fait un warning te disant qu'elle n'est jamais utilisée.
    Si tu ne te sers pas de cette variable il n'y a pas spécialement de contradiction, il a jamais besoin de savoir où sont ses initialisations. Par contre elle ne sert à rien.

    La règle est simple : on n'a le droit de commencer à utiliser une variable, qu'après être tombé sur un point où on est sûr qu'elle a été initialisée. Avant ce point, on peut l'initialiser où on veut et autant de fois qu'on veut.
    On ne tombe jamais sur un tel point, mais on ne tombe jamais sur une utilisation non plus. La règle est donc respectée, ou plus exactement elle ne se pose jamais.
    Si je comprends bien, pour le compilateur une variable est à utiliser si elle figure dans une instruction. Dans ce cas, le compilateur transforme la variable à utiliser, regarde à quoi il correspond et regarde si elle est initialisée et si l'initialisation est la bonne pour cette variable. Si c'est le cas, il peut utiliser cette variable (il compile). Si on déclare la variable e par int e sans une instruction où figure e, pour le compilateur cette variable n'est pas à utiliser et pour lui, il ne sert à rien de regarder l'initialisation d'une variable qui n'est pas à utiliser, donc qui ne sert à rien. De ce fait, il compile quand même.
    C'est vrai qu'il n'y a aucune contradiction.

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Si tu cherches des termes plus exacts, il s'agit de l'évaluation d'une variable, qui doit avoir lieu après qu'elle ait été initialisée.

    Si je devais séparer en cas d'école à retenir, je dirais qu'une variable précédemment déclarée peut apparaître dans trois cas :
    - évaluation simple : a + b, appelDeMethode(a) ou ce genre de choses.
    - assignation simple : a = 3; Dans ce cas elle n'est pas évaluée et n'a pas besoin d'avoir été initialisée d'abord.
    - évaluation/assignation : a++; ou a += 3; par exemple. Dans ce cas elle est évaluée et assignée dans la même expression.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Si tu cherches des termes plus exacts, il s'agit de l'évaluation d'une variable, qui doit avoir lieu après qu'elle ait été initialisée.

    Si je devais séparer en cas d'école à retenir, je dirais qu'une variable précédemment déclarée peut apparaître dans trois cas :
    - évaluation simple : a + b, appelDeMethode(a) ou ce genre de choses.
    - assignation simple : a = 3; Dans ce cas elle n'est pas évaluée et n'a pas besoin d'avoir été initialisée d'abord.
    - évaluation/assignation : a++; ou a += 3; par exemple. Dans ce cas elle est évaluée et assignée dans la même expression.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Essaieval{
        public static int ajouter(int a){
    	int b=7;
    	return a+b;
        }
    Dans cet exemple, on voit que la classe Essaieval compile. La variable a n'est pas initialisée. Donc a n'est pas évaluée par le compilateur.
    et qu'est ce qui se passe pour la variable a au niveau du compilateur autrement dit comment le compilateur traite-t-il la variable a? et finalement la somme a+b?

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    La variable a est un paramètre de méthode, pas une variable locale -_-°. Elle n'est pas déclarée à l'intérieur de la méthode, mais dans la signature de la méthode.

    Elle est initialisée à la valeur passée pour ce paramètre lors de l'appel de cette méthode.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    J'espère ne pas dire de bêtise, mais en fait, si, la variable a est une variable locale pour le compilateur. Seulement, comme elle est déclarée dans la signature de la méthode, pour le compilateur, il y a une affectation implicite des paramètres de la fonction. Ici, on affecte à "a" la valeur du paramètre indiqué lors de l'appel.

    Lorsque tu fais Essaieval.ajouter(3); il se passe ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int a = 3;
    int b = 7;
    return 3 + 7;
    Bien sûr, c'est juste pour illustrer. En fait, lors de la compilation, lors d'une déclaration de variable dans la signature, le compilateur sait qu'on va lui fournir la valeur de la variable au moment de l'appel. Pour lui, pas besoin de s'inquiéter avant l'appel de Essaieval.ajouter(x). C'est pour ça que tu auras une erreur au niveau de l'appel si tu essaie d'appeler Essaieval.ajouter(), ou Essaieval.ajouter("a"), ou Essaieval.ajouter(1.1)

  16. #16
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    J'espère ne pas dire de bêtise, mais en fait, si, la variable a est une variable locale pour le compilateur.
    C'est sûr qu'il n'y a pas de grosse différence, mais, il y a notamment la différence qu'il y a pas à exiger de première assignation, puisqu'une valeur lui est passée par l'appel de la méthode.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Merci beaucoup thelvin et sharcoux. Je suis très satisfait.

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

Discussions similaires

  1. Erreur "variable dimension2 might not have been initialized"
    Par jy03154586 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 02/11/2011, 12h45
  2. Réponses: 1
    Dernier message: 06/10/2011, 11h41
  3. Que signifie "The local variable A1 may not have been initialized"
    Par lyess dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 23/05/2011, 17h44
  4. Réponses: 3
    Dernier message: 03/05/2010, 18h12
  5. erreur:The local variable may not have been initialized
    Par wiss20000 dans le forum Langage
    Réponses: 7
    Dernier message: 22/03/2007, 15h18

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