#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 в момент, когда вы его тестируете, и следующая строка, в которой вы объявляете и инициализируете локальную переменную, которая немедленно выпадает из области видимости, одинаково бессмысленна, поэтому весь связанный код можно просто удалить.