Возможно, переменная не была инициализирована ошибкой
Когда я пытаюсь скомпилировать это:
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
.
Ответ 2
Локальные переменные не получают значения по умолчанию. Их начальные значения равны undefined, не назначая значения каким-либо образом. Прежде чем вы сможете использовать локальные переменные, они должны быть инициализированы.
Существует большая разница, когда вы объявляете переменную на уровне класса (как член, то есть как поле) и на уровне метода.
Если вы объявляете поле на уровне класса, они получают значения по умолчанию в соответствии с их типом. Если вы объявляете переменную на уровне метода или в виде блока (означает, что anycode внутри {}) не получает никаких значений и остается undefined, пока каким-то образом они не получат некоторые начальные значения, то есть некоторые значения, назначенные им.
Ответ 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
Ответ 5
Вы объявили их, но не инициализировали их со значением. Добавьте что-то вроде этого:
int a = 0;
Ответ 6
Вы не инициализировали a
и b
, только объявили их. Существует тонкая разница.
int a = 0;
int b = 0;
По крайней мере, это для С++, я полагаю, что Java - это одно и то же понятие.
Ответ 7
Вы объявили их в начале метода, но вы никогда не инициализировали их. Инициализация будет устанавливать их равными значению, например:
int a = 0;
int b = 0;
Ответ 8
Вы заявили о них, но не указали им первоначальную ценность - таким образом, они не инициализированы. Попробуйте что-то вроде:
public static Rand searchCount (int[] x)
{
int a = 0 ;
int b = 0 ;
и предупреждения должны исчезнуть.
Ответ 9
Представьте, что произойдет, если x [l] не является ни 0, ни 1 в цикле. В этом случае a и b никогда не будут назначены и имеют значение undefined.
Вы должны инициализировать их как с некоторым значением, например 0.
Ответ 10
Установите переменную "a" на некоторое значение, подобное этому,
a=0;
Объявление и инициализация различаются.
Удача
Ответ 11
int a = 0;
int b = 0;