我正在为学校开展一个项目,我们必须多次旋转一个立方体,并找到从立方体中收到的最长的数字。我几乎完成了代码,它符合,但每当我运行它我得到相同的错误:
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 + ".");
}
}
答案 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[] arr
和int ans
。 static
变量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
后才能初始化