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 :

Interrogation suspect : Variable globale initialisée & variable locale non-initialisé


Sujet :

Langage Java

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 497
    Points : 312
    Points
    312
    Par défaut Interrogation suspect : Variable globale initialisée & variable locale non-initialisé
    Bonjour,

    Quelqu'un peut m'expliquer pourquoi, si je n'initialise pas la variable b, j'ai une erreur de compilation (variable non initialisé):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Class popo{
    
    int a;
    
    public void main (void){
    int b;
    
    System.out.print("a : " + a + " b : " + b);
    
     }
    }


    mais, si elle l'est :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Class popo{
    
    int a;
    
    public void main (void){
    int b = 0;
    
    System.out.print("a : " + a + " b : " + b);
    
     }
    }
    et bien, ca compile et ca donne :


    pourquoi le compil initialise les variables globales et pas locales ?

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Les variables d'instance sont initialisées à leur valeur par défaut lors de l'instanciation de la classe, juste avant l'appel au constructeur. Donc pour un int, c'est initialisé à 0, pour un double c'est 0.0, pour un boolean c'est false, etc., et pour une référence c'est null.
    Par contre les variables locales, donc à l'intérieur d'une méthode, ne sont pas initialisées par le compilateur, et elles ne peuvent pas être utilisées sans avoir été initialisées auparavant, d'où la plainte du compilateur dans ton cas.
    C'est comme ça que fonctionne Java, et pas besoin de demander pourquoi, les règles sont les règles
    SCJP 5 / SCBCD 1.3 Certified

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 497
    Points : 312
    Points
    312
    Par défaut
    Merci deadpool :

    Initialisation de membre

    Java prend en charge l'initialisation des variables avant leur utilisation. Dans le cas des variables locales à une méthode, cette garantie prend la forme d'une erreur à la compilation.
    Mais ca ne répond pas a ma question.

    cette garantie prend la forme d'une erreur à la compilation.
    Pourquoi ?

    Pourquoi, java prend en charge les var globales et pas les locales ?

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 497
    Points : 312
    Points
    312
    Par défaut
    C'est comme ça que fonctionne Java, et pas besoin de demander pourquoi, les règles sont les règles


    ah bah, dans ce cas la ...

    plus de question ....

  5. #5
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Faut lire plus attentivement.

    Pour les variables locales :

    Bien entendu, le compilateur aurait pu donner à i une valeur par défaut, mais il est plus probable qu'il s'agit d'une erreur de programmation et une valeur par défaut aurait masqué ce problème
    Pour les variables d'instances :

    Cependant, si une valeur primitive est un membre de données d'une classe, les choses sont un peu différentes. Comme n'importe quelle méthode peut initialiser ou utiliser cette donnée, il ne serait pas très pratique ou faisable de forcer l'utilisateur à l'initialiser correctement avant son utilisation. Cependant, il n'est pas correct de la laisser avec n'importe quoi comme valeur, Java garantit donc de donner une valeur initiale à chaque membre de données avec un type primitif.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par 19cmos83 Voir le message

    ah bah, dans ce cas la ...

    plus de question ....
    Non mais, je pense que le document explique bien pourquoi le compilateur ne le permet pas, parce qu'il peut bien s'agir d'une erreur de programmation, et le compilateur n'est pas censé faire des déductions dans ce genre de conditions. Donc pour être "safe", il l'interdit. Je ne sais pas si ce n'est pas une raison suffisante pour toi.
    SCJP 5 / SCBCD 1.3 Certified

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 497
    Points : 312
    Points
    312
    Par défaut
    Bien entendu, le compilateur aurait pu donner à i une valeur par défaut, mais il est plus probable qu'il s'agit d'une erreur de programmation et une valeur par défaut aurait masqué ce problème
    Pour les variables d'instances :

    Citation:
    Cependant, si une valeur primitive est un membre de données d'une classe, les choses sont un peu différentes. Comme n'importe quelle méthode peut initialiser ou utiliser cette donnée, il ne serait pas très pratique ou faisable de forcer l'utilisateur à l'initialiser correctement avant son utilisation. Cependant, il n'est pas correct de la laisser avec n'importe quoi comme valeur, Java garantit donc de donner une valeur initiale à chaque membre de données avec un type primitif.
    Oui, tres clair ...
    Merci

  8. #8
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Tout simplement parceque la variable globale peut être modifiée partout dans ta classe, alors que la variable locale n'a comme visibilité que la methode dans laquelle elle est utilisée, donc il lui faut une valeur, on ne peut pas la modifier en dehors de cette méthode, ca signifie que si tu déclares une variable dans une méthode, tu en auras forcément besoin (d'où l'obligation d'initialisaiton à un moment ou à un autre), si tu n'en as pas besoin, alors pas besoin d'en déclarer une.

    C'est de la logique, dans les méthodes on a besoin, on initialise, sinon, on déclare pas, dans les classes on ne peut pas vérifier où on l'utilise, donc on initialise par défaut au cas où.

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

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

Discussions similaires

  1. [2.x] Initialisation de variable globale
    Par chezdevelopping dans le forum Symfony
    Réponses: 4
    Dernier message: 18/06/2013, 21h30
  2. DLL et initialisation des variables globales.
    Par Spidyy dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2012, 17h09
  3. [AC-2003] Variables globales initialisées dans Form_Load qui perdent leurs valeurs
    Par mamadouabd dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/01/2010, 23h09
  4. Réponses: 20
    Dernier message: 12/02/2008, 17h25
  5. Initialisation des variables globales dans un package
    Par fred_hte_savoie dans le forum SQL
    Réponses: 2
    Dernier message: 17/04/2007, 10h26

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