这是我的程序,但它不会运行,我不知道如何解决它...它会引发异常!
它应该组合三个数组并对长度为12的新数组进行排序并将其打印出来。如果你没有马上修好它,我会很感激,因为这是作业。但我知道一切,我似乎无法弄清楚这一点!我对异常很不好......这是错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Combine.Combine(Combine.java:25)
at Combine.main(Combine.java:12)
这是程序:
public class Combine {
public static void main(String[] args){
int[] a = {1,4,5,6 };
int[] b = {3,8,9,11};
int[] c = {0,2,7,10};
Combine( a, b, c);
}
public static int[] Combine(int[] a, int[] b, int[] c)
{
int[] answer = new int[12];
int i = 0, j = 0, k = 0, p = 0;
while (i < 5 && j < 5)
{
if (a[i] < b[j])
answer[k++] = a[i++];
else
answer[k++] = b[j++];
}
while (i < 5 && p < 5 )
{
if (a[i] < c[p])
answer[k++]= a[i++];
else
answer[k++]= c[p];
}
while (j < 5 && p < 5 )
{
if (b[j] < c[p])
answer[k++]= b[j++];
else
answer[k++]= c[p++];
}
while (i < 5)
answer[k++] = a[i++];
while (j < 5)
answer[k++] = b[j++];
while (p < 5)
answer[k++] = c[p++];
return answer;
}
}
答案 0 :(得分:2)
我认为你应该在使用5的任何地方使用4。
在Java中,4个元素的数组 arr arr.length = 4 , 通常你像这样循环它
for (int i=0; i<4; i++){
// do something
}
所以尝试将5改为4。 通过使用5,你将超出数组的范围。
更好的是,使用这种循环:
for (int i=0; i<arr.length; i++){
// do something
}
后者是一种更好的做法,
比硬编码4的长度
同样的说法适用于while循环。
答案 1 :(得分:1)
更改此
while (i < 5 && j < 5) //and while (i < 5 && p < 5 ) and while (j < 5 && p < 5 )
和这个
while (i < 5) // and j and p.
到 - &gt;
while (i < 4 && j < 4) //and while (i < 4 && p < 4 ) and while (j < 4 && p < 4 )
和
while (i < 4) // and j and p.
索引从0到3,而不是1到4,这就是你获得该异常的原因。
答案 2 :(得分:1)
所有数组的长度均为4,表示从0到3的有效索引。但是在该代码中,您可以访问索引4:
while (i < 5 && j < 5)
{
if (a[i] < b[j])
answer[k++] = a[i++];
else
answer[k++] = b[j++];
}
这是因为你的while条件检查索引是否低于5.检查a.length和b.length以下更安全。
同时,依靠API的现有方法甚至更安全:
答案 3 :(得分:0)
使用<4
而不是<5
或者您可以像这样使用
for (int val: arr)
{
//do something
}
答案 4 :(得分:0)
基本上你的数组有4个元素,所以它的长度为0-3,在if条件下你将它检查为0-4。因此它给出错误。
如果将它替换为4而不是5,则代码将正常运行。
public class Combine {
public static void main(String[] args) {
int[] a = { 1, 4, 5, 6 };
int[] b = { 3, 8, 9, 11 };
int[] c = { 0, 2, 7, 10 };
Combine(a, b, c);
}
public static int[] Combine(int[] a, int[] b, int[] c) {
int[] answer = new int[12];
int i = 0, j = 0, k = 0, p = 0;
while (i < 4 && j < 4) {
System.out.println("@"+i);
if (a[i] < b[j])
answer[k++] = a[i++];
else
answer[k++] = b[j++];
}
while (i < 4 && p < 4) {
if (a[i] < c[p])
answer[k++] = a[i++];
else
answer[k++] = c[p];
}
while (j < 4 && p < 4) {
if (b[j] < c[p])
answer[k++] = b[j++];
else
answer[k++] = c[p++];
}
while (i < 4)
answer[k++] = a[i++];
while (j < 4)
answer[k++] = b[j++];
while (p < 4)
answer[k++] = c[p++];
return answer;
}
}