尽管有足够的可用空间,但数组索引超出范围

时间:2015-09-07 11:24:29

标签: java arrays indexoutofboundsexception

我正在编写一段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行例外。

任何人都知道可能导致这种情况的原因是什么?

2 个答案:

答案 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,并使用比ik更多的描述性迭代器,如此除了天真的迭代器之外,它们确实有其他意义,你有很多它们 - 更好的名称可以让它更容易遵循复杂的循环。)