Вопрос-ответ

Variable might not have been initialized error

Ошибка, возможно, переменная не была инициализирована

Когда я пытаюсь скомпилировать это:

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

...

}

Я получаю эти ошибки:

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

Мне кажется, что я инициализировал их в верхней части метода. Что происходит не так?

Переведено автоматически
Ответ 1

Вы объявили их, но не инициализировали. Их инициализация - это установка им значения:

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

Вы получаете ошибку, потому что вы не инициализировали переменные, но увеличиваете их (например, a++) в for цикле.

Примитивы Java имеют значения по умолчанию, но, как прокомментировал один пользователь ниже


Их значение по умолчанию равно нулю, когда они объявлены как члены класса. Локальные переменные не имеют значений по умолчанию


Ответ 2

Локальные переменные не получают значений по умолчанию. Их начальные значения не определены без назначения значений каким-либо способом. Прежде чем вы сможете использовать локальные переменные, они должны быть инициализированы.

Существует большая разница, когда вы объявляете переменную на уровне класса (как элемент, т.е. как поле) и на уровне метода.

Если вы объявляете поле на уровне класса, они получают значения по умолчанию в соответствии со своим типом. Если вы объявляете переменную на уровне метода или как блок (означает любой код внутри {}), они не получают никаких значений и остаются неопределенными до тех пор, пока каким-то образом не получат некоторые начальные значения, т.е. Некоторые значения, присвоенные им.

Ответ 3

Если бы они были объявлены как поля класса, то они действительно были бы инициализированы значением 0.

Вы немного сбиты с толку, потому что если вы напишете:

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

Тогда этот код выведет "0". Это потому, что при создании нового экземпляра Clazz будет вызван специальный конструктор. Сначала будет вызвана super () переменная, затем неявно будет инициализировано поле a, а затем будет выполнена строка b = 0.

Ответ 4

Вы объявили их, но не инициализировали.

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