java 我的代码中出现索引越界异常[重复]

5anewei6  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(138)

此问题已在此处有答案

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数组上做一些计算。

bbmckpt7

bbmckpt71#

for (x = 0; x < N; x++) {

      arr[x] = input.nextInt();

   }

在此代码之后,x的值为N。因此引发Exception。

mwyxok5s

mwyxok5s2#

ArrayIndexOutOfBounds异常似乎在这一行

sum += arr[x] ;

如果N是5,则x只能从0到4。看起来你正在尝试访问arr[5],它超出了绑定范围。

b4lqfgs4

b4lqfgs43#

你声明x,让它递增,直到它等于数组的长度,然后将它传递给一个函数,在那里你再次使用它来索引数组,但现在它里面的数字大于数组的任何有效索引。因此,它会因IndexOutOfBoundsException而崩溃。
所以直接的问题是,当你用这个变量来索引数组时,你没有一个合理的值。但大局是:是时候学习如何控制复杂性了,因为你已经在创造那些对你来说太难推理的东西了。
控制复杂性的最佳工具是:1)限制变量的范围; 2)编写内聚方法,这意味着方法只做一件定义良好的事情。
你的变量x没有很好的理由在for循环之外定义,你可以把它修改成这样,这样它就只在循环内部定义了:

for (int x = 0; x < N; x++) {
    arr[x] = input.nextInt();
}

这样x就有一个且只有一个任务,当x完成它的任务时,你就不必再担心它了,你就摆脱了它。
没有理由将x传递给我可以看到的AVER方法。可以使用arr.length来查找arr中的元素个数。如果在AVER方法中确实需要另一个变量,请创建一个AVER本地变量。你传递x并没有节省任何东西,你只是给自己带来麻烦。
更改AVER以执行以下操作:
1.只传入你想要的平均值的数组作为参数,其他什么都不传,
1.返回对数组的值求平均的结果,而不是返回void(这样可以清楚地知道什么是输入,什么是输出),以及
1.删除所有与计算平均值无关的东西,并将其放在其他地方,就像在一个单独的静态方法中计算负数(并且不做任何其他事情)。

相关问题