it-roy-ru.com

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

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

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

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

46
David

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

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

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

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

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

71
mipadi

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

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

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

69
reddy

Если бы они были объявлены как поля класса, то они действительно были бы инициализированы с 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.

6
Roman

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

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

Вы объявили их, но не инициализировали их значением. Добавьте что-то вроде этого:

int a = 0;
2
Jerome

Вы не инициализировали a и b, только объявили их. Есть небольшая разница.

int a = 0;
int b = 0;

По крайней мере, это для C++, я предполагаю, что Java - та же самая концепция.

1
Andy Shellam

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

int a = 0;
int b = 0;
1
Thomas Owens

Установите переменную "a" в какое-то значение, подобное этому,

a=0;

Декларирование и инициализация разные. 

Удачи

1
Rishabh Agarwal

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

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

и предупреждения должны уйти.

1
Bob Jarvis

Представьте, что происходит, если x [l] не равен ни 0, ни 1 в цикле. В этом случае a и b никогда не будут назначены и имеют неопределенное значение . Вы должны инициализировать их обоих некоторым значением, например 0.

1
codymanix

Хорошей практикой является инициализация локальных переменных внутри блока метода перед его использованием. Вот ошибка, которую может совершить новичок.

  public static void main(String[] args){
    int a;
    int[] arr = {1,2,3,4,5};
    for(int i=0; i<arr.length; i++){
        a = arr[i];
    }
    System.out.println(a);
  }

Вы можете ожидать, что консоль покажет «5», но вместо этого компилятор выдаст ошибку «переменная а не инициализирована». Хотя можно подумать, что переменная a «инициализирована» внутри цикла for, компилятор так не считает. Что если arr.length равен 0? Цикл for не будет выполняться вообще. Следовательно, компилятор даст variable a might not have been initialized, чтобы указать на потенциальную опасность и потребовать от вас инициализации переменной.

Чтобы избежать такого рода ошибок, просто инициализируйте переменную при ее объявлении.

int a = 0;
0
jackycflau