线程 java.lang.ArrayIndexOutOfBoundsException 中的异常:5
Exception in thread java.lang.ArrayIndexOutOfBoundsException: 5
我是新手,正在尝试完成以下教程
// Create a method called countEvens
// Return the number of even ints in the given array.
// Note: the % "mod" operator computes the remainder, e.g. 5 % 2 is 1.
/*
* SAMPLE OUTPUT:
*
* 3
* 0
* 2
*
*/
下面是我的代码
public static void main(String[] args) {
int a[] = {2, 1, 2, 3, 4};
countEvens(a); // -> 3
int b[] = {2, 2, 0};
countEvens(b); // -> 3
int c[] = { 1, 3, 5};
countEvens(c); // -> 0
}
public static void countEvens(int[] x){
int i = 1;
int count = 0;
while ( i <= x.length){
if (x[i] % 2 == 0){
count ++;
}
i ++;
}
System.out.println(count);
}
代码可以运行,但我收到以下错误消息
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at apollo.exercises.ch05_conditionals.Ex5_CountEvens.countEvens(Ex5_CountEvens.java:23)
at apollo.exercises.ch05_conditionals.Ex5_CountEvens.main(Ex5_CountEvens.java:10)
我可以知道我做错了什么吗?
在 while ( i <= x.length)
处循环,直到 i
等于 到 x
的长度。数组的最后一个索引始终是 length - 1,因此将小于等于 (<=
) 更改为小于 (<
).此外,将 i
初始化为 0
,因为 Java 数组是从零开始的。
行
while ( i <= x.length)
应该是
while ( i < x.length)
如果x
的length
为5,则索引为0、1、2、3、4,索引从0到长度减一数组。
然而,最简洁的方法是使用 for each 循环而不是 while 循环:
public static void countEvens(int[] x) {
int count = 0;
for (int number : x)
if (number % 2 == 0)
count++;
System.out.println(count);
}
Java(和大多数其他语言)中的数组是从 0 开始的 索引。但是数组的 长度是数组中元素的个数。所以对于你的数组 a[]
int a[] = {2,1,2,3,4};
索引增加到 4,而长度为 5。
由于 <=
(小于等于)运算符,您正在从 1~5 遍历数组,但数组的索引为 0~,因此出现索引越界错误4.当您访问数组的每个元素时,您应该使用
if (x[i-1] % 2 == 0) //iterates from 0~4 rather than 1~5
否则你可以设置迭代器int i = 0;
并使用小于<
运算符来确保迭代器移动0~4
'i'应该从0到length()-1,因为数组索引从0开始,最后一个元素的索引是length()- 1.
因此,您的代码的正确版本应该是:
public static void countEvens(int[] x){
int i = 0;
int count = 0;
while ( i < x.length){
if (x[i] % 2 == 0){
count ++;
}
i ++;
}
System.out.println(count);
}
对于您的特定目的,for 循环会更简单。
for(int i = 0; i< x.length(); i++){
if(x[i]%2==0){
count++;
}
}
我是新手,正在尝试完成以下教程
// Create a method called countEvens
// Return the number of even ints in the given array.
// Note: the % "mod" operator computes the remainder, e.g. 5 % 2 is 1.
/*
* SAMPLE OUTPUT:
*
* 3
* 0
* 2
*
*/
下面是我的代码
public static void main(String[] args) {
int a[] = {2, 1, 2, 3, 4};
countEvens(a); // -> 3
int b[] = {2, 2, 0};
countEvens(b); // -> 3
int c[] = { 1, 3, 5};
countEvens(c); // -> 0
}
public static void countEvens(int[] x){
int i = 1;
int count = 0;
while ( i <= x.length){
if (x[i] % 2 == 0){
count ++;
}
i ++;
}
System.out.println(count);
}
代码可以运行,但我收到以下错误消息
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at apollo.exercises.ch05_conditionals.Ex5_CountEvens.countEvens(Ex5_CountEvens.java:23)
at apollo.exercises.ch05_conditionals.Ex5_CountEvens.main(Ex5_CountEvens.java:10)
我可以知道我做错了什么吗?
在 while ( i <= x.length)
处循环,直到 i
等于 到 x
的长度。数组的最后一个索引始终是 length - 1,因此将小于等于 (<=
) 更改为小于 (<
).此外,将 i
初始化为 0
,因为 Java 数组是从零开始的。
行
while ( i <= x.length)
应该是
while ( i < x.length)
如果x
的length
为5,则索引为0、1、2、3、4,索引从0到长度减一数组。
然而,最简洁的方法是使用 for each 循环而不是 while 循环:
public static void countEvens(int[] x) {
int count = 0;
for (int number : x)
if (number % 2 == 0)
count++;
System.out.println(count);
}
Java(和大多数其他语言)中的数组是从 0 开始的 索引。但是数组的 长度是数组中元素的个数。所以对于你的数组 a[]
int a[] = {2,1,2,3,4};
索引增加到 4,而长度为 5。
由于 <=
(小于等于)运算符,您正在从 1~5 遍历数组,但数组的索引为 0~,因此出现索引越界错误4.当您访问数组的每个元素时,您应该使用
if (x[i-1] % 2 == 0) //iterates from 0~4 rather than 1~5
否则你可以设置迭代器int i = 0;
并使用小于<
运算符来确保迭代器移动0~4
'i'应该从0到length()-1,因为数组索引从0开始,最后一个元素的索引是length()- 1.
因此,您的代码的正确版本应该是:
public static void countEvens(int[] x){
int i = 0;
int count = 0;
while ( i < x.length){
if (x[i] % 2 == 0){
count ++;
}
i ++;
}
System.out.println(count);
}
对于您的特定目的,for 循环会更简单。
for(int i = 0; i< x.length(); i++){
if(x[i]%2==0){
count++;
}
}