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;