Возможно, переменная не была инициализированной ошибкой - PullRequest
54 голосов
/ 15 марта 2010

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

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

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

Ответы [ 11 ]

83 голосов
/ 15 марта 2010

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

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

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

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

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

73 голосов
/ 06 января 2013

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

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

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

6 голосов
/ 15 марта 2010

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

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

int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization
3 голосов
/ 15 марта 2010

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

int a = 0;
2 голосов
/ 15 марта 2010

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

2 голосов
/ 15 марта 2010

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

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

и предупреждения должны исчезнуть.

2 голосов
/ 15 марта 2010

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

int a = 0;
int b = 0;
1 голос
/ 14 мая 2018

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

  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;
1 голос
/ 28 июня 2016

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

a=0;

Объявление и инициализация различны.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...