我正在编写一段Java代码,该代码从.txt文件中读取数据并将其存储在2D数组中。对于某些文件,代码工作得非常好,但对于其他文件,它会抛出一个ArrayIndexOutOfBoundsException,即使据我所知,数组有足够的空间!
以下是代码:
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!");
}
}
我在行
上得到了例外 parsedData[i][k] = parts[k];
这非常烦人,我似乎无法在任何地方找到问题的答案,特别是因为即使文本文件无法正常工作,它仍会正确解析文件的前60行例外。
任何人都知道可能导致这种情况的原因是什么?
答案 0 :(得分:2)
您假设parts
数组将始终具有amountOfSeparators
个元素,但每次通过调用parts = (temp[i]).split(" ");
为其分配新数组时,其中一些调用可能会返回比你期望的更短的阵列。
以下代码将确保parts
数组具有所需的长度:
parts = (temp[i]).split(" ");
parts = Arrays.copyOf(parts, amountOfSeparators);
答案 1 :(得分:0)
parts = (temp[i]).split(" ");
此行返回 new 数组,然后将其存储在变量parts
中。您最初创建的阵列不再由parts
引用。
由split()
创建的这个新数组将包含与分隔符之间的元素一样多的元素。不保证具有完全amountOfSeparators
个元素或更多元素。你的内循环声明需要是:
for(int k = 0; k < amountOfSeparators && k < parts.size(); k++) {
(还有关于样式的注释:使用运算符周围的一致空格,例如k < amountOfSeparators
而非k< amountOfSeparators
,并使用比i
,k
更多的描述性迭代器,如此除了天真的迭代器之外,它们确实有其他意义,你有很多它们 - 更好的名称可以让它更容易遵循复杂的循环。)