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?
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
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.
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.
Vous les avez déclarés, mais pas initialisés.
int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization
Vous les avez déclarés mais ne les avez pas initialisés avec une valeur. Ajouter quelque chose comme ça:
int a = 0;
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.
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;
Définissez la variable "a" sur une valeur comme celle-ci,
a=0;
Déclarer et initialiser sont tous deux différents.
Bonne chance
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.
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.
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;