2017-01-02 2 views
-1

Я объявил массив String.Почему мой массив (5 элементов) меняет размер динамически?

String[] csvColumns = new String[5]; 

Однако, при чтении из файла CSV:

 String[] csvColumns = new String[5]; // Explicitly including this declaration again in case Stack Overflow users need to see the scope of the variable. 
    String row; // Will receive each column of 1 line at a time of the CSV file. 
    while ((row = inFile.readLine()) != null) // BufferedReader used to parse CSV File. 
     { 
     csvColumns = row.split(","); // Each element of the array will recieve the value of each column. 
     // Initialise class attributes with each column. 
     } 

Если столбец в строке файла CSV не содержит каких-либо значений (в моем файле это только когда-либо может быть дело для последнего столбца, потому что столбец не является обязательным и содержит заметки о конкретной проблеме), тогда csvColumns уменьшает его размер на 1. Я не вижу, как это возможно, если я использую массив, - но опять же, я - новичок-программист.

Любая причина, почему это может случиться?

Редактировать * Спасибо за оба ответа, очень полезно. Должен был проверить тип возврата метода split! (Спасибо @chrylis).

ответ

4

Во-первых, csvColumns не является статическим (это локальная переменная), а во-вторых, это переменная , а не массив. Вы переназначаете значение (ссылку на массив) как ссылку на новый массив, возвращаемый split. (Этот старый String[5], который вы создали и никогда не использовали сейчас, не имеет ничего общего с ним и будет собираться мусором.)

+0

Спасибо. У меня создалось впечатление, что термин для массива этого типа назывался «статическим массивом» - глупым. –

+0

Поняв, что тип возврата «split» действительно был блестящим, просто понимая, что теперь - как не было «нового» оператора, но не думал проверять тип возврата «split» –

3

Массив не меняет его размер. Вы просто создать новый массив по этой линии

csvColumns = row.split(",") 

и присвоить его переменной csvColumns.

И старый массив new String[5] будет собираться с мусором, потому что на него больше не ссылаются никакие переменные.

Вы можете изменить

String[] csvColumns = new String[5]; 

в

String[] csvColumns = null; 

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

+0

Даже назначение «null» не обязательно, потому что он получает назначение в цикле перед чтением. – chrylis

+0

Да, но лучше всего явно инициализировать переменную со значением (даже «null»). Но, конечно, это вопрос в стиле кода. Я явно назначил его здесь, чтобы сделать более понятным для ОП, чтобы понять, что происходит. – djxak

+1

Многие программисты прошли обучение десятилетиями, чтобы инициализировать переменные чем-то в случае «несчастных случаев», но я никогда не был доволен этим. В Java это на самом деле имеет меньше смысла, чем на других языках, потому что у Java есть правила, которые пытаются предотвратить использование переменной до ее инициализации, и компилятор поймает случаи, когда вы это сделаете. Если вы инициализируете переменные до бессмысленного значения, то компилятор не поймает его, и это может сделать его более длинным для обнаружения ошибок кодирования такого рода. Поэтому я бы назвал это «худшей практикой» на Java. – ajb

Смежные вопросы