Проблема с инициализацией переменной при нестатическом

#java #arrays #initialization #javac

#java #массивы #инициализация #javac

Вопрос:

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

 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 не будет компилировать его, потому что он предупреждает меня, что

возможно, переменные данные не были инициализированы

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

Ответ №1:

Вы объявляете локальную 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];
    }
}
  

Комментарии:

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

2. @Eran Это должно было быть вызвано Test . double является ключевым словом и, следовательно, не идентификатором и, следовательно, не является законным именем метода.

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

Ответ №2:

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