如何修复数组OutOfBoundsException?

时间:2013-11-26 18:50:05

标签: java arrays indexoutofboundsexception

我正在为学校开展一个项目,我们必须多次旋转一个立方体,并找到从立方体中收到的最长的数字。我几乎完成了代码,它符合,但每当我运行它我得到相同的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at number_cube.number_cube.cubeToss(number_cube.java:20)
    at number_cube.number_cube.main(number_cube.java:10)

有人可以帮我吗?

这是我的代码:

public class number_cube { 
    public static int ans;
    public static void main(String[]args){
        Scanner scan = new Scanner(System.in);
        System.out.println("How many times would you like to toss the cube?");
        ans = scan.nextInt();
        cubeToss();
        getLongestRun();
        System.out.println();
    }

    public static int arr[] = new int[ans];

    public static int[] cubeToss(){
        for(int i = 0; i < ans; i++){
            int randnum = (int) (1 + Math.random() * (6-1));
            arr[i] = randnum;
        }
        return arr;
    }

    public static void getLongestRun(){
        int longest = 0;
        int length = 1;
        for(int i = 1; i < ans; i++)
            if(arr[i] == arr[i-1]){
                length++;
            } 

            else{
                length = 1;
            }

        if(length > longest){
            longest = length;
        }

        System.out.println("The longest run is " + longest + ".");
    }
}

4 个答案:

答案 0 :(得分:5)

您使用变量ans作为arr数组的长度,但是在创建数组时,ans没有值(Java将其初始化为0),所以arr数组的长度为0.在初始化类之前不调用main方法;在调用static方法之前初始化所有main变量。

在有效长度之前不要创建数组:

ans = scan.nextInt();
arr = new int[ans];  // Add this line.
cubeToss();

答案 1 :(得分:3)

您需要在获得值for ans后初始化数组。目前,您在程序启动时使用ans = 0初始化数组(其中ans为0)。

正确的解决方案可能是:

 public static void main(String[]args){
        Scanner scan = new Scanner(System.in);
        System.out.println("How many times would you like to toss the cube?");
        arr[] = new int[scan.nextInt()];

答案 2 :(得分:1)

public static int arr[] = new int[ans];

当JVM仍在尝试执行类main的方法number_cube时,从jls-12.4:开始,只有在类初始化时才允许调用。但是,类的初始化包括为类中声明的static字段(类变量)执行静态初始值设定项初始值设定项

这就是为什么,在类上下文中声明的静态字段总是首先被实例化。 对于您的课程:int[] arrint ansstatic变量ans初始化为值0,默认值为整数。因此,实例化static数组arr的长度为0且为空。当您尝试使用循环在cubeToss()函数中访问它时,由于数组的长度为AIBE 0(或者数组为空),因此抛出0

因此,在使用ans阅读main方法中的主要方法中的ans = scan.nextInt();之后,请尝试在主方法中创建数组:arr = new int[ans]

答案 3 :(得分:0)

public static int[] arr;

然后只有在ans

获得System.in后才能初始化