84 votes

Erreur : la variable n'a peut-être pas été initialisée

Quand j'essaie de compiler ceci :

public static Rand searchCount (int[] x)
{
    int a ;
    int b ;

    ...

    for (int l= 0; l<x.length; l++)
    {
        if (x[l] == 0)
        a++ ;
        else if (x[l] == 1)
        b++ ;
    }

    ...

}

Je reçois ces erreurs :

Rand.java:72: variable a might not have been initialized
                a++ ;
                ^
Rand.java:74: variable b might not have been initialized
                b++ ;
                ^
2 errors

Il me semble que je les ai initialisés au début de la méthode. Qu'est-ce qui ne va pas ?

136voto

mipadi Points 135410

Vous déclaré mais vous ne les avez pas initialisés. Les initialiser, c'est les rendre égaux à une valeur :

int a;        // This is a declaration
a = 0;        // This is an initialization
int b = 1;    // This is a declaration and initialization

Vous obtenez l'erreur parce que vous n'avez pas initialisé les variables, mais vous les incrémentez (par ex, a++ ) dans le for boucle.

Les primitives Java ont des valeurs par défaut mais comme l'a fait remarquer un utilisateur ci-dessous

Leur valeur par défaut est zéro lorsqu'ils sont déclarés comme membres de classe. Les variables locales n'ont pas de valeur par défaut

96voto

reddy Points 71

Les variables locales n'ont pas de valeurs par défaut. Leurs valeurs initiales sont indéfinies si on ne leur attribue pas de valeurs par un moyen quelconque. Avant de pouvoir utiliser les variables locales, elles doivent être initialisées.

Il y a une grande différence lorsque vous déclarez une variable au niveau de la classe (en tant que membre, c'est-à-dire en tant que champ) et au niveau de la méthode.

Si vous déclarez un champ au niveau de la classe, il obtient des valeurs par défaut en fonction de son type. Si vous déclarez une variable au niveau de la méthode ou en tant que bloc (c'est-à-dire tout code à l'intérieur de {}), elle ne reçoit aucune valeur et reste indéfinie jusqu'à ce qu'elle reçoive des valeurs de départ, c'est-à-dire des valeurs qui lui sont attribuées.

9voto

Roman Points 21807

S'ils étaient déclarés comme des champs de la classe, ils seraient réellement initialisés avec 0.

Vous êtes un peu confus parce que si vous écrivez :

class Clazz {
  int a;
  int b;

  Clazz () {
     super ();
     b = 0;
  }

  public void printA () {
     sout (a + b);
  }

  public static void main (String[] args) {
     new Clazz ().printA ();
  }
}

Alors ce code imprimera "0". C'est parce qu'un constructeur spécial sera appelé lorsque vous créerez une nouvelle instance de Clazz. Au premier super () sera appelé, puis le champ a sera initialisée implicitement, puis la ligne b = 0 sera exécuté.

5voto

Jerome Points 5318

Vous les avez déclarés, mais vous ne les avez pas initialisés avec une valeur. Ajoutez quelque chose comme ceci :

int a = 0;

5voto

Konrad Garus Points 19280

Vous les avez déclarés, mais pas initialisés.

int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X