2016-10-02 2 views
0

Я пытаюсь удвоить массив в нестатической контексте следующим образом:Проблемы с инициализацией переменной при нестатическая

public class Test { 
    int[] data=new int[1]; 

    public void Double(){ 
     if(data == null){ 
      int[] data=new int[1]; 
     } 
     int[] data=new int[data.length*2]; 
    } 

    public static void main(String[] args){ 
     Test table = new Test(); 
     table.data=new int[1]; 
    } 
} 

Javac не будет компилировать его, потому что он предупреждает меня, что

переменные данные не могли быть инициализированы

несмотря на то, что, очевидно, был инициализирован, как я могу обойти эту проблему?

ответ

2

Вы объявляете локальную переменную data в своем методе Double() (на самом деле вы объявляете две такие переменные), которая скрывает переменную экземпляра с тем же именем.

Поэтому в заявлении:

int[] data=new int[data.length*2]; 

Вы обращаетесь data.length перед локальной переменной data инициализируется.

Изменить его:

public void Double(){ 
    if(data == null){ 
     data=new int[1]; 
    } else { 
     data=new int[data.length*2]; 
    } 
} 
+0

Извините, слишком поверхностно читал и пытался найти муху в супе. –

+0

@Eran Его следовало назвать «Тест». 'double' - это ключевое слово и, следовательно, не идентификатор и, следовательно, не имя юридического метода. – EJP

+0

@EJP Я не думал об этом. Однако, поскольку целью этого метода является удвоение длины массива-члена, возможно, 'doubleArray()' будет лучше соответствовать. Вызывать его с тем же именем, что и класс, тоже сбивает с толку, поскольку он не является конструктором. – Eran

0

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