Variável pode não ter sido inicializada

Quando eu tento compilar isso:

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++ ; } ... } 

Eu recebo esses erros:

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

Parece-me que eu inicializei eles no topo do método. O que está errado?

Você os declarou , mas não os inicializou. Inicializá-los é configurá-los como iguais a um valor:

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

Você obtém o erro porque você não inicializou as variables, mas as incrementa (por exemplo, a++ ) no loop for .

Variáveis ​​locais não recebem valores padrão. Seus valores iniciais são indefinidos sem atribuição de valores por alguns meios. Antes de poder usar variables ​​locais, elas devem ser inicializadas.

Há uma grande diferença quando você declara uma variável no nível da class (como um membro, isto é, como um campo) e no nível do método.

Se você declarar um campo no nível de class, eles recebem valores padrão de acordo com o tipo. Se você declarar uma variável no nível do método ou como um bloco (significa anycode dentro {}), não obtém nenhum valor e permanece indefinido até que, de alguma maneira, eles obtenham alguns valores iniciais, isto é, alguns valores designados a eles.

Se eles fossem declarados como campos da class, eles seriam realmente inicializados com 0.

Você está um pouco confuso porque se você escrever:

 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 (); } } 

Então este código irá imprimir “0”. É porque um construtor especial será chamado quando você criar uma nova instância do Clazz. No primeiro, super () será chamado, então o campo a será inicializado implicitamente e, em seguida, a linha b = 0 será executada.

Você os declarou, mas não inicializou.

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

Você os declarou, mas não os inicializou com um valor. Adicione algo assim:

 int a = 0; 

Você não inicializou a e b , apenas os declarou. Há uma diferença sutil.

 int a = 0; int b = 0; 

Pelo menos isso é para C ++, presumo que Java é o mesmo conceito.

Você os declarou no início do método, mas nunca os inicializou. Inicializando seria definindo-os igual a um valor, como:

 int a = 0; int b = 0; 

Você os declarou, mas não os forneceu com um valor inicial – portanto, eles não são autorizados. Tente algo como:

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

e os avisos devem desaparecer.

Imagine o que acontece se x [l] não é nem 0 nem 1 no loop. Nesse caso, a e b nunca serão atribuídos e terão um valor indefinido. Você deve inicializá-los com algum valor, por exemplo, 0.

Defina a variável “a” para algum valor como este,

 a=0; 

Declarar e inicializar são ambos diferentes.

Boa sorte

 int a = 0; int b = 0; 

É uma boa prática inicializar as variables ​​locais dentro do bloco de methods antes de usá-lo. Aqui está um erro que um iniciante pode cometer.

  public static void main(String[] args){ int a; int[] arr = {1,2,3,4,5}; for(int i=0; i 

Você pode esperar que o console mostre '5', mas, em vez disso, o compilador lançará o erro 'variável a não ser inicializado'. Embora se possa pensar que uma variável é 'inicializada' dentro do loop for, o compilador não pensa dessa maneira. E se arr.length for 0? O loop for não será executado de todo. Portanto, o compilador fornecerá variable a might not have been initialized para apontar o perigo potencial e exigir que você inicialize a variável.

Para evitar esse tipo de erro, basta inicializar a variável quando você a declarar.

 int a = 0;