在 ArrayIndexOutOfBoundsException 中对程序执行结果进行排序
Sort program execution results in ArrayIndexOutOfBoundsException
请考虑以下代码:
import java.io.*; //Sorts by dividing the array in 2 groups then joining them
public class Esercizio29 {static void join(char[] a, int l, int m, int u) {
char[] b = new char[u - 1 + 1];
int i = l, j = m + 1, k = 0;
while (i <= m && j <= u)
if (a[i] <= a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
while (i <= m)
b[k++] = a[i++];
while (j <= u)
b[k++] = a[j++];
for (k = 0; k <= u - l; k++)
a[k + l] = b[k];
}
//Sorts the array from l to u
static void sort(char[] a, int l, int u) {
int m;
if (l != u) {
m = (l + u) / 2;
sort(a,l,m);
sort(a,m + 1,u);
join(a,l,m,u);
}
}
public static void main(String[] args) throws IOException{
final int N = 16;
char temp, v[] = new char[N];
for (int i = 0; i < N; i++)
v[i] = (char) System.in.read();
sort(v, 0, N - 1);
System.out.println("Vettore ordinato: ");
for(int i = 0; i < N; i++)
System.out.print(v[i]);
System.out.println();
}}
在 运行 这段代码之后它给了我这个结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Esercizio29.fondi(Esercizio29.java:14)
at Esercizio29.ordina(Esercizio29.java:27)
at Esercizio29.ordina(Esercizio29.java:25)
at Esercizio29.ordina(Esercizio29.java:25)
at Esercizio29.ordina(Esercizio29.java:25)
at Esercizio29.main(Esercizio29.java:39)
这个错误是什么意思,我该如何解决?谢谢。
实际上java.lang.ArrayIndexOutOfBoundsException意味着您正在访问大于数组大小的数组元素。
示例:
int[] array = {1,2,3,4};
for(int i=0;i<5;i++){
System.out.println(array[i]);//when i =4 it will show exception.
}
因为我只为数组分配了 4 个元素,这意味着数组大小为 4。现在如果我想访问第 5 个元素,它将显示 运行时间异常,因为数组索引以 0 开头并且数组只有 4 elements.In 你的情况在第 14 行你正在访问大于数组大小的数组元素。所以它导致 运行 时间异常 "java.lang.ArrayIndexOutOfBoundsException"
好吧,ArrayIndexOutOfBoundsException 错误意味着您试图访问在您的数组中找不到的索引 - 在本例中为索引 1(这意味着您的数组在第一个 (0) 索引处包含一个值).
您的异常是由 join 方法抛出的,您确实在该方法中尝试访问单个大小数组的第二个索引。你没有对你的数组访问操作伙伴进行完整性检查,我担心这是一个不好的做法......
以下修复将使您的代码 运行 符合预期:
public class Esercizio29 {static void join(char[] a, int l, int m, int u) {
char[] b = new char[u]; // replaced redundent [u - 1 + 1]
int i = l, j = m + 1, k = 0;
while (i <= m && j <= u)
if (a[i] <= a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
while (i <= m && k < b.length) // integrity check
b[k++] = a[i++];
while (j <= u && k < b.length) { // integrity check
b[k++] = a[j++];
}
for (k = 0; k <= u - l && k < a.length && k < b.length; k++) // integrity checks
a[k + l] = b[k];
}
改一下这行代码就可以了
char[] b = new char[u + 1];
你在做 -1 + 1 导致 ArrayIndexOutOfBounds
请考虑以下代码:
import java.io.*; //Sorts by dividing the array in 2 groups then joining them
public class Esercizio29 {static void join(char[] a, int l, int m, int u) {
char[] b = new char[u - 1 + 1];
int i = l, j = m + 1, k = 0;
while (i <= m && j <= u)
if (a[i] <= a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
while (i <= m)
b[k++] = a[i++];
while (j <= u)
b[k++] = a[j++];
for (k = 0; k <= u - l; k++)
a[k + l] = b[k];
}
//Sorts the array from l to u
static void sort(char[] a, int l, int u) {
int m;
if (l != u) {
m = (l + u) / 2;
sort(a,l,m);
sort(a,m + 1,u);
join(a,l,m,u);
}
}
public static void main(String[] args) throws IOException{
final int N = 16;
char temp, v[] = new char[N];
for (int i = 0; i < N; i++)
v[i] = (char) System.in.read();
sort(v, 0, N - 1);
System.out.println("Vettore ordinato: ");
for(int i = 0; i < N; i++)
System.out.print(v[i]);
System.out.println();
}}
在 运行 这段代码之后它给了我这个结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Esercizio29.fondi(Esercizio29.java:14)
at Esercizio29.ordina(Esercizio29.java:27)
at Esercizio29.ordina(Esercizio29.java:25)
at Esercizio29.ordina(Esercizio29.java:25)
at Esercizio29.ordina(Esercizio29.java:25)
at Esercizio29.main(Esercizio29.java:39)
这个错误是什么意思,我该如何解决?谢谢。
实际上java.lang.ArrayIndexOutOfBoundsException意味着您正在访问大于数组大小的数组元素。
示例:
int[] array = {1,2,3,4};
for(int i=0;i<5;i++){
System.out.println(array[i]);//when i =4 it will show exception.
}
因为我只为数组分配了 4 个元素,这意味着数组大小为 4。现在如果我想访问第 5 个元素,它将显示 运行时间异常,因为数组索引以 0 开头并且数组只有 4 elements.In 你的情况在第 14 行你正在访问大于数组大小的数组元素。所以它导致 运行 时间异常 "java.lang.ArrayIndexOutOfBoundsException"
好吧,ArrayIndexOutOfBoundsException 错误意味着您试图访问在您的数组中找不到的索引 - 在本例中为索引 1(这意味着您的数组在第一个 (0) 索引处包含一个值).
您的异常是由 join 方法抛出的,您确实在该方法中尝试访问单个大小数组的第二个索引。你没有对你的数组访问操作伙伴进行完整性检查,我担心这是一个不好的做法......
以下修复将使您的代码 运行 符合预期:
public class Esercizio29 {static void join(char[] a, int l, int m, int u) {
char[] b = new char[u]; // replaced redundent [u - 1 + 1]
int i = l, j = m + 1, k = 0;
while (i <= m && j <= u)
if (a[i] <= a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
while (i <= m && k < b.length) // integrity check
b[k++] = a[i++];
while (j <= u && k < b.length) { // integrity check
b[k++] = a[j++];
}
for (k = 0; k <= u - l && k < a.length && k < b.length; k++) // integrity checks
a[k + l] = b[k];
}
改一下这行代码就可以了
char[] b = new char[u + 1];
你在做 -1 + 1 导致 ArrayIndexOutOfBounds