Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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;