此问题已在此处有答案:
What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?(24回答)
昨天关门了。
package myMethods;
import java.util.Scanner;
public class CalculationsOnArrays {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int x ;
System.out.println("How many numbers are in the array");
int N = input.nextInt();
int[] arr = new int [N] ;
System.out.println("Enter the numbers") ;
for (x = 0; x < N; x++) {
arr[x] = input.nextInt();
}
double average = 0 ;
int count_negative_elements = 0;
// calling method
AVER(arr, average, count_negative_elements, N, x);
input.close();
}
static void AVER(int[] arr, double average, int count_negative_numbers, int N, int x) // passing parameters to the method
{
int sum = 0, count = 0, negative_numbers = 0 ;
sum += arr[x] ;
average = sum / N;
System.out.println("The average of the numbers is " + average);
if (arr[x] < 0) {
count++ ;
negative_numbers = arr[x] ;
System.out.println("The negative numbers in the array are " + count);
System.out.println("They are " + negative_numbers) ;
}
}
}
我想在1D数组上做一些计算。
3条答案
按热度按时间bbmckpt71#
在此代码之后,x的值为N。因此引发Exception。
mwyxok5s2#
ArrayIndexOutOfBounds异常似乎在这一行
如果N是5,则x只能从0到4。看起来你正在尝试访问arr[5],它超出了绑定范围。
b4lqfgs43#
你声明x,让它递增,直到它等于数组的长度,然后将它传递给一个函数,在那里你再次使用它来索引数组,但现在它里面的数字大于数组的任何有效索引。因此,它会因IndexOutOfBoundsException而崩溃。
所以直接的问题是,当你用这个变量来索引数组时,你没有一个合理的值。但大局是:是时候学习如何控制复杂性了,因为你已经在创造那些对你来说太难推理的东西了。
控制复杂性的最佳工具是:1)限制变量的范围; 2)编写内聚方法,这意味着方法只做一件定义良好的事情。
你的变量x没有很好的理由在for循环之外定义,你可以把它修改成这样,这样它就只在循环内部定义了:
这样x就有一个且只有一个任务,当x完成它的任务时,你就不必再担心它了,你就摆脱了它。
没有理由将x传递给我可以看到的AVER方法。可以使用arr.length来查找arr中的元素个数。如果在AVER方法中确实需要另一个变量,请创建一个AVER本地变量。你传递x并没有节省任何东西,你只是给自己带来麻烦。
更改AVER以执行以下操作:
1.只传入你想要的平均值的数组作为参数,其他什么都不传,
1.返回对数组的值求平均的结果,而不是返回void(这样可以清楚地知道什么是输入,什么是输出),以及
1.删除所有与计算平均值无关的东西,并将其放在其他地方,就像在一个单独的静态方法中计算负数(并且不做任何其他事情)。