web-dev-qa-db-fra.com

La variable n'a peut-être pas été initialisée

Quand j'essaye 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ées en haut de la méthode. Qu'est-ce qui ne va pas? 

46
David

Vous les {déclarés} _, mais vous ne les avez pas initialisés. Les initialiser, c'est les mettre à 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 car vous n'avez pas initialisé les variables, mais vous les incrémentez (par exemple, a++) dans la boucle for.

Les primitives Java ont des valeurs par défaut, mais un utilisateur a commenté ci-dessous

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

71
mipadi

Les variables locales ne reçoivent pas les valeurs par défaut. Leurs valeurs initiales sont indéfinies sans assigner des valeurs par certains moyens. Avant de pouvoir utiliser des 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, par exemple, en tant que champ) et au niveau de la méthode.

Si vous déclarez un champ au niveau de la classe, ils obtiennent les valeurs par défaut en fonction de leur type. Si vous déclarez une variable au niveau de la méthode ou sous la forme d'un bloc (n'importe quel code à l'intérieur de {}), n'obtenez aucune valeur et restez indéfinie jusqu'à l'obtention d'une valeur de départ, c'est-à-dire une valeur qui lui est affectée.

69
reddy

S'ils étaient déclarés comme champs de la classe, ils seraient vraiment 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 ();
  }
}

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

6
Roman

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

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

Vous les avez déclarés mais ne les avez pas initialisés avec une valeur. Ajouter quelque chose comme ça:

int a = 0;
2
Jerome

Vous n'avez pas initialisé a et b, seulement les avez déclarés. Il y a une différence subtile.

int a = 0;
int b = 0;

Au moins c'est pour C++, je suppose que Java est le même concept.

1
Andy Shellam

Vous les avez déclarés au début de la méthode, mais vous ne les avez jamais initialisés. Initialiser serait leur attribuer une valeur, telle que:

int a = 0;
int b = 0;
1
Thomas Owens

Définissez la variable "a" sur une valeur comme celle-ci,

a=0;

Déclarer et initialiser sont tous deux différents. 

Bonne chance

1
Rishabh Agarwal

Vous les avez déclarés mais ne leur avez pas fourni de valeur initiale - ils ne sont donc pas initialisés. Essayez quelque chose comme:

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

et les avertissements devraient disparaître.

1
Bob Jarvis

Imaginez ce qui se passe si x [l] n'est ni 0 ni 1 dans la boucle. Dans ce cas, a et b ne seront jamais affectés et auront une valeur indéfinie . Vous devez les initialiser tous les deux avec une valeur, par exemple 0.

1
codymanix

Il est recommandé d’initialiser les variables locales dans le bloc de méthode avant de l’utiliser. Voici une erreur qu'un débutant peut commettre.

  public static void main(String[] args){
    int a;
    int[] arr = {1,2,3,4,5};
    for(int i=0; i<arr.length; i++){
        a = arr[i];
    }
    System.out.println(a);
  }

Vous pouvez vous attendre à ce que la console affiche «5», mais le compilateur générera une erreur «variable a peut-être pas initialisée». Bien que l'on puisse penser que la variable a est 'initialisée' dans la boucle for, le compilateur ne pense pas de cette façon. Que se passe-t-il si arr.length est 0? La boucle for ne sera pas exécutée du tout. Par conséquent, le compilateur donnera variable a might not have been initialized pour signaler le danger potentiel et vous obliger à initialiser la variable.

Pour éviter ce type d'erreur, initialisez simplement la variable lorsque vous la déclarez.

int a = 0;
0
jackycflau