2012-12-04 48 views
1

即时通讯57线越界出错。任何帮助表示赞赏。该程序需要1个整数,并使用该许多索引创建和排列。它然后要求更多的整数来填补它。然后将所有的偶数数字放入第二个数组中,然后输出。阵列Outofbounds异常

run: 
Enter the ammount of integers you will require. 
10 
Enter your integers: 
1 
Enter your integers: 
2 
Enter your integers: 
3 
Enter your integers: 
4 
Enter your integers: 
5 
Enter your integers: 
6 
Enter your integers: 
7 
Enter your integers: 
8 
Enter your integers: 
9 
Enter your integers: 
0 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
    at AllEven.arrcheck2(AllEven.java:57) 
    at AllEven.main(AllEven.java:24) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 4 seconds) 

CODE

import java.util.*; 

public class AllEven { 

public static void main(String[] args) { 
    int read; 

    Scanner kybd = new Scanner(System.in); 

    System.out.println("Enter the ammount of integers you will require."); 

    read = kybd.nextInt(); 

    int[] arr1 = new int[read]; 
    int[] arr2; 

    int count = 0; 
    arrRead(arr1); 
    arrcheck(arr1); 

    arr2 = new int[count]; 

    arrcheck2(arr1, arr2); 
    mainPrint(arr2); 



} 

public static int arrcheck(int[] arr1) { 
    int count = 0; 
    for (int i = 0; i < arr1.length; i++) { 
     if (arr1[i] % 2 == 0) { 
      count++; 

     } 

    } 
    return count; 
} 

public static void arrRead(int[] arr1) { 
    Scanner kybd = new Scanner(System.in); 

    for (int i = 0; i < arr1.length; i++) { 
     System.out.println("Enter your integers: "); 
     arr1[i] = kybd.nextInt(); 

    } 
} 

public static void arrcheck2(int[] arr1, int[] arr2) { 
    int j = 0; 
    for (int i = 0; i < arr1.length; i++) { 
     if (arr1[i] % 2 == 0) { 
      arr2[j] = arr1[i]; 
      j++; 

     } 

    } 

} 

public static void mainPrint(int[] arr2) { 
    for (int i = 0; i < arr2.length; i++) { 
     System.out.println("Printing Even Numbers."); 
     System.out.println(arr2[i]); 
    } 
} 
} 

确定,所以感谢大家谁帮助,但现在的整数已被输入程序后,刚刚完成后不显示任何内容。

+2

在代码中添加注释,其实际失败 – bellum

+1

错误消息说明您做错了什么。您尝试访问阵列中比数组长度大的索引号。在你的代码中放入一些System.out.println(...),你可能会看到你做错了什么。 –

回答

1

对于初学者,你有你的arrcheck函数返回一个计数,而不是做任何事情。我怀疑你的意思写的是这样的:

arrRead(arr1); 
int count = arrcheck(arr1); 

否则你的下一行:

arr2 = new int[count]; 

创建大小为0的数组将尽快访问它导致数组越界。

另外你拼写的数量错了,我认为程序的其余部分应该与上面的变化一起工作。

2

在创建arr2之前,您需要在计数变量中分配返回值arrcheck调用。否则,你会创建arr2与大小为0

变化: -

int count = 0; 
arrRead(arr1); 
arrcheck(arr1); 

到: -

arrRead(arr1); 
int count = arrcheck(arr1); 
1

的代码简单介绍一下之后,我觉得你的问题就在这里:

int count = 0; 
arrRead(arr1); 
arrcheck(arr1); 

arr2 = new int[count]; //array of size 0! 

arrcheck2(arr1, arr2); 
1

您将arr2定义为零长度数组:

int count = 0; 
.... 
arr2 = new int[count]; 

然后,在arrcheck2你也行:

arr2[j] = arr1[i]; 

这不会起作用,因为arr2没有长度,所以你不能把任何东西进去。

1

arr2的大小是0.所以当你尝试访问一个不存在的索引时,你会得到异常。

1

创建与长度的阵列0

arr2 = new int[count]; 

你应该给它大于0 如果你希望它是相同长度ARR1的长度只是做arr2 = new int[read];

+0

该死的在30秒内相同的答案张贴了4次。我开始变慢... –

1

您需要将arr2初始化为与arr1相同的长度。 int count = read将解决问题。或者您可以完全删除计数,只需在初始化阵列时使用读取。

read = kybd.nextInt(); 

    int[] arr1 = new int[read]; 
    int[] arr2; 

    int count = read; 
    arrRead(arr1); 
    arrcheck(arr1); 

    arr2 = new int[count]; 
1

您未初始化您的阵列int[] arr2。您不应该使用数组来填充初始数组中的偶数元素,因为数组在初始化时需要确定的大小 - 如果必要,最好使用ArrayList,然后在知道确定的大小后将其转化为数组。