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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 averti
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 averti
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 47
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    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

+ 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