Java 数组索引越界异常排序



我目前有以下代码。我在这一行得到ArrayIndexOutofBoundsException。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Module3_1_Sort.sort(Module3_1_Sort.java:70)
at Module3_1.s_2d_string(Module3_1.java:155)

相应的行如下。

dta[flagcounter] = dta[x];
sortValues = s.sort(sortValues,counter, sortBy, searchterm);

我很确定它不会超过数组的长度......

有人可以帮忙吗?谢谢!

程序代码如下

    static public void s_2d_string () {
    c.println("2D String Array Program");
    int counter,x;
    c.print("How many entries do you wish to sort? ");
    counter = c.readInt();
    String[][] sortValues = new String[counter+1][2];
    for (x=0;x<counter;x++) {
        c.print("Enter book name: ");
        sortValues[x][0] = c.readLine();
        c.print("Enter book author: ");
        sortValues[x][1] = c.readLine();
    }
    c.print("Which column would you like to sort by? 1 or 2? ");
    int sortBy = c.readInt();
    sortBy = sortBy-1;
    c.print("Enter search term: ");
    String searchterm = c.readLine();
    sortValues = s.sort(sortValues,counter, sortBy, searchterm);
    int flagcounter_int = Integer.parseInt(sortValues[0][0]);
    c.println(flagcounter_int + " results found.");
    for (x=0;x<flagcounter_int;x++) {
        c.println(sortValues[x+1][0] + ", " + sortValues[x+1][1]);
    }
}

static public String[][] sort (String dta[][], int totalNo, int sortBy, String searchterm)  {
    boolean found = false;    
    int flagcounter = 0;
        for (int x=0; x<dta.length;x++) {
            if (sortBy == 0) {
                if (searchterm.equalsIgnoreCase(dta[x][0])) {
                    found = true;
                    flagcounter = flagcounter+1;
                    dta[flagcounter] = dta[x];
                }
            }
            if (sortBy == 1) {
                if (searchterm.equalsIgnoreCase(dta[x][1])) {
                    found = true;
                    flagcounter = flagcounter+1;
                    dta[flagcounter] = dta[x];
                }
            }
        }
    String flagcounter_string = Integer.toString(flagcounter);
    dta[0][0] = flagcounter_string;
    return (dta);
}   

看看for循环以及你在其中处理flagcounter的方式。for循环说:

for (int x = 0; x < dta.length; x++)

当您找到搜索词时,flagcounter会递增,然后再将其用作索引:

flagcounter = flagcounter + 1;
dta[flagcounter] = dta[x];

发生的情况是,如果您在第一行中有匹配项,您会在下一行中不断找到它(因为您覆盖了它(,最终会超出界限。

让我们看一个例子。假设您有这个作为输入:

Book            Author
-----------------------------
Proven Guilty   Jim Butcher
Naked Sun       Isaac Asimov

所以dta会是这样的:

[
    ["Proven Guilty", "Jim Butcher"],
    ["Naked Sun", "Isaac Asimov"],
    [null, null]
]

假设你正在寻找作者"吉姆·布彻"。所以当你进入循环时,你有x = 0, flagcounter = 0.您立即找到匹配项,发生的情况是:

flagcounter = flagcounter + 1; // flagcounter is now 1
dta[flagcounter] = dta[x]; // i.e. dta[1] = dta[0];

所以现在dta数组看起来像这样:

[
    ["Proven Guilty", "Jim Butcher"],
    ["Proven Guilty", "Jim Butcher"],
    [null, null]
]

可以看到会发生什么:你不断将上一行分配给下一行,最后你处于x = 2flagcounter = 2的情况,你试图做dta[3] = dta[2],这超出了dta的范围。

正如安息日所建议的,你需要纠正for循环。但是,我认为您可能缺少更多的东西来让它做你想做的事。除此之外,dta[flagcounter] = dta[x]; 不会将x行中的值分配给flagcounter行,而是实际上通过引用使flagcounter指向x行。

将代码从

for (int x=0; x<dta.length;x++) {
        if (sortBy == 0) {
            if (searchterm.equalsIgnoreCase(dta[x][0])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
        if (sortBy == 1) {
            if (searchterm.equalsIgnoreCase(dta[x][1])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
    }

for (int x=0; x<totalNo;x++) {
        if (sortBy == 0) {
            if (searchterm.equalsIgnoreCase(dta[x][0])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
        if (sortBy == 1) {
            if (searchterm.equalsIgnoreCase(dta[x][1])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
    }

最新更新