Java 为什么我的数组(5个元素)会动态改变大小?

Java 为什么我的数组(5个元素)会动态改变大小?,java,arrays,Java,Arrays,我声明了一个字符串数组 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 re

我声明了一个
字符串
数组

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)。

首先,
csvColumns
不是静态的(它似乎是一个局部变量),其次,它是一个变量,而不是数组。您正在将值(数组引用)重新指定为对
split
返回的新数组的引用。(您创建但从未使用过的旧
字符串[5]
现在没有任何指向它的内容,将被垃圾收集。)

该数组不会更改其大小。您只需通过此行创建一个新数组

csvColumns = row.split(",")
并将其分配给
csvColumns
变量

旧的
新字符串[5]
数组将被垃圾收集,因为它不再被任何变量引用

你可以改变

String[] csvColumns = new String[5];


您的代码仍然可以工作,因为您从未使用创建的数组。您只需使用变量

,谢谢。我的印象是,这种类型的数组的术语被称为“静态数组”-很愚蠢。弄清楚“split”的返回类型真是太棒了,现在就明白了-因为没有“new”操作符,但不认为检查“split”的返回类型,即使
null
赋值也不必要,因为它是在读取之前在循环中赋值的。是的,但最好使用值显式初始化变量(甚至
null
)。当然,这是一个代码式的问题。我在这里显式地分配它是为了让OP更清楚地了解正在发生的事情。几十年来,许多程序员都接受过训练,在发生“意外”时将变量初始化为某种形式,但我对此一直不满意。在Java中,它实际上没有在其他语言中那么有意义,因为Java有一些规则,试图在变量初始化之前阻止它被使用,并且编译器会在初始化时捕获实例。如果您将变量初始化为一个无意义的值,那么编译器将无法捕获它,这可能会延长检测这种性质的编码错误的时间。所以我实际上把这称为Java中的“最糟糕的做法”。@ajb我从来没有想过:“如果你将变量初始化为一个无意义的值,那么编译器将无法捕获它”。所以,我想你就在这里!至少对于局部变量。
String[] csvColumns = null;