Java 虽然有足够的可用空间,但数组索引超出范围
我正在编写一段Java代码,从.txt文件中读取数据并将其存储在2D数组中。对于某些文件,代码运行得非常好,但是对于其他文件,它抛出了ArrayIndexOutOfBoundsException,尽管据我所知,数组有足够的空间 代码如下:Java 虽然有足够的可用空间,但数组索引超出范围,java,arrays,indexoutofboundsexception,Java,Arrays,Indexoutofboundsexception,我正在编写一段Java代码,从.txt文件中读取数据并将其存储在2D数组中。对于某些文件,代码运行得非常好,但是对于其他文件,它抛出了ArrayIndexOutOfBoundsException,尽管据我所知,数组有足够的空间 代码如下: import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ExtractData { static Strin
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ExtractData {
static String[][] data;
static String line;
static int amountOfEntries;
static int amountOfSeparators;
public static String[][] getData(String filename) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(filename));
System.out.println("Fetching data for file " + filename);
amountOfEntries = Utilities.countLines(filename);
amountOfSeparators = (Utilities.countOccurencesOfCharacter(filename, ' ') / amountOfEntries) + 1;
String[] temp = new String[amountOfEntries]; // for extracted data, still needs to be separated
int alpha = 0;
while((line = in.readLine()) != null) {
temp[alpha] = line;
alpha++;
}
in.close();
System.out.println("Done!");
System.out.println("Parsing Data to Cache...");
String[][] parsedData = new String[amountOfEntries][amountOfSeparators];
String[] parts = new String[amountOfSeparators];
for (int i = 0; i < amountOfEntries; i++) {
parts = (temp[i]).split(" ");
for (int k = 0; k < amountOfSeparators; k++) {
parsedData[i][k] = parts[k];
Utilities.debugMethod(filename + "[" + i + "][" + k + "]", parsedData[i][k]);
}
}
System.out.println("Done!");
return parsedData;
}
public static void fetchDataAndParsetoSQL(String filename) throws IOException {
System.out.println("Present working directory: " + System.getProperty("user.dir"));
data = getData(filename);
System.out.println("Creating SQL statements and writing to file...");
String tablename = Utilities.sqltableName(filename);
toSQL.SQLOutput(data, tablename, filename);
System.out.println("Done!");
}
}
这是非常烦人的,我似乎在任何地方都找不到问题的答案,特别是因为即使文本文件不起作用,它仍然会在抛出异常之前正确解析文件的前60行
有人知道这是什么原因吗 您假设
parts
数组将始终具有amountOfSeparators
元素,但每次通过调用parts=(temp[i])为其分配一个新数组。split(“”)代码>,其中一些调用可能返回比预期更短的数组
以下代码将确保部件
阵列具有所需的长度:
parts = (temp[i]).split(" ");
parts = Arrays.copyOf(parts, amountOfSeparators);
此行返回一个新数组,该数组存储在变量部分中。您最初创建的数组不再由部件引用
这个由split()
创建的新数组将包含与分隔符之间的元素数量相同的元素。它不能保证有确切的数量的分离器元素或更多元素。您的内部循环声明需要:
for(int k = 0; k < amountOfSeparators && k < parts.size(); k++) {
for(int k=0;k
(还有一个关于风格的注意事项:在操作符周围使用一致的空格,例如,k
notk
,并使用比i
,k
更多的描述性迭代器,因为在这种情况下,它们的含义不是单纯的迭代器,而且它们有很多,更好的名称可以让它更具代表性。)请显示确切的异常,以及i
和k
的值。请注意,您提供的代码甚至不会编译,因为'
不是有效的字符文字。循环条件不应该包含部分[]考虑长度?异常会告诉您数组的大小和所使用的索引值。其中一个不是您所期望的。当在此处抱怨错误时,请始终引用完整而准确的错误消息。是的!这正是发生的情况,只是为每个递归调用打印出部分的长度。但是,当(temp[i]).split(“”);有f.i.74条目和第77部分,如何将剩余的、未使用的索引设置为null?我想这将是自动的…@SpadeJohnsson您可以在每次迭代中创建一个新的amountOfSeparators
元素数组,然后将(temp[i])split的元素复制到该数组中
array。这样未使用的索引将为空。@SpadeJohnsson或更好的-parts=(temp[i]).split(“”;parts=Arrays.copyOf(parts,amountOfSeparators);
谢谢您修复了它!
parts = (temp[i]).split(" ");
for(int k = 0; k < amountOfSeparators && k < parts.size(); k++) {