Java 虽然有足够的可用空间,但数组索引超出范围

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

我正在编写一段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!");
    }
}
这是非常烦人的,我似乎在任何地方都找不到问题的答案,特别是因为即使文本文件不起作用,它仍然会在抛出异常之前正确解析文件的前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
not
k
,并使用比
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++) {