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

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

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

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

58
задан Péter Török 15 March 2010 в 16:50
поделиться

8 ответов

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

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

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

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

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

90
ответ дан 24 November 2019 в 18:39
поделиться

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

2
ответ дан 24 November 2019 в 18:39
поделиться

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

int a = 0;
3
ответ дан 24 November 2019 в 18:39
поделиться

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

int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization
4
ответ дан 24 November 2019 в 18:39
поделиться

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

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

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

2
ответ дан 24 November 2019 в 18:39
поделиться

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

7
ответ дан 24 November 2019 в 18:39
поделиться

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

int a = 0;
int b = 0;
2
ответ дан 24 November 2019 в 18:39
поделиться

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

int a = 0;
int b = 0;

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

1
ответ дан 24 November 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: