字符串数组大小被修改

4
String str[] = new String[5];
CSVReader read = new CSVReader(new FileReader("abc.csv"));
str = read.readNext();
str[3] = "A";

在上述代码片段中,我声明了一个大小为5的字符串数组。我使用OpenCSV解析我的CSV文件。该CSV文件有三列。语句str = read.readNext()将值存储在str [0],str [1],str [2]中。问题在于,在执行此语句后,数组str的大小减小到3。由于这个原因,str [3] 抛出ArrayIndexOutOfBounds异常。为什么数组的大小从5缩小到3呢?

1
语句“str = read.readNext()”将值存储在“str [0]”,“str [1]”,“str [2]”中。不,它并不是这样的。它会用全新的数组替换掉原来的“str”。 - Louis Wasserman
4个回答

6

array 的大小不能改变,但是 read.readNext 返回一个全新的数组,并且其大小可能不同,你正在将其赋值给同一变量 str


1
"

readNext正在为您返回一个全新的数组:

"
String str[] = new String[5];

意思是“将'str'指向一个长度为5的新字符串数组”。
CSVReader read = new CSVReader(new FileReader("abc.csv"));

创建一个名为“read”的新CSVReader。
str = read.readNext();

调用'readNext'并将'str'设置为引用结果(即使我刚才要求您使用该名称来引用长度为5的新空字符串数组)

str[3] = "A";

现在从readNext结果中访问第4个元素。 顺便提一下,因为您没有创建'str'引用的数组,所以不知道它的大小,因此需要在其上使用.length。

0

你没有读取数组中的内容,而是给str变量赋了一个新对象。

如果你将str变量定义为final,编译器会报错。这其实是一种很好的做法。使用final关键字可以表达你不打算改变对象引用,编译器会帮助你强制执行这一点,以防止意外重新分配变量。

原始数组的大小不会改变,因为数组是不可变的(在维度方面)。在read.readNext()之后,原始数组(大小为5)不再被引用,并且将被垃圾回收。但在被回收之前,它仍然保持大小为5(尽管此时这个大小有些无关紧要)。


这不是重新声明变量,而是给变量赋予一个新的值。这是非常不同的。 - Jon Skeet

0
readNext()函数返回一个String[]数组的引用,数组的大小与csv文件中的列数相同,并将它存储在str变量中。
之后,str指向这个String数组。你重新声明了它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接