[英]Java Array Index out of bounds Exception Sort
我目前有以下代碼。 我在這一行得到了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 (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];
}
}
}
查看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]
]
假設您正在尋找作者“Jim Butcher”。 所以當你進入循環時,你有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 = 2
和flagcounter = 2
的情況下你嘗試做dta[3] = dta[2]
,超出dta
的范圍。
正如安息日所說,你需要糾正for
循環。 但是,我認為你可能會遺漏更多東西,讓它做你想做的事。 除此之外,還有事實是dta[flagcounter] = dta[x];
不會將x
行中的值分配給flagcounter
行,但實際上會使flagcounter
行指向 x
行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.