我有一个主类,要求用户输入数字(整数)。该数字将是另一个类中数组的大小。我将使用Math.random填充该数组。
这是主类:
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Write amount of numbers between 0-99: ");
int num = input.nextInt();
IckeMain im = new IckeMain();
im.setNum(num);
im.fillArray();
}
这是另一类:
public class IckeMain {
Scanner inread = new Scanner (System.in);
int num;
int [] array = new int [num];
int [] nyArr = new int [num];
public void fillArray () {
System.out.println("You chose: " + num + " with size: " +array.length);
for (int j=0; j<num; j++) {
array[j] = (int)(Math.random() * 99);
System.out.println("Unsorted: " +array[j]);
}
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
现在,假设我在主类中输入“ 5”。这是我将得到的输出。
Write amount of numbers between 0-99:
5
You chose: 5 With size: 0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
因此,显然将变量num设置为用户指定的数字。但是,以某种方式,考虑到它显示为0,该数组似乎无法“获取”该数字。为什么?
答案 0 :(得分:1)
这是因为您的数组声明-
int [] array = new int [num];
int [] nyArr = new int [num];
hapnum的num =0。将num值设置为5后,这些初始化不会发生。因此,由于声明的数组实际上是空的,因此索引0本身的差异和ArrayIndexOutOfBoundsException
都是空的,没有大小全部。
你可以
array = new int[num];
nyArr = new int [num];
在setNum()方法中,以便num的新值反映在数组大小中。
答案 1 :(得分:1)
问题是您在知道数组大小之前就创建了数组。
我将您的代码更改为此:
public class IckeMain {
Scanner inread = new Scanner (System.in);
int num;
int [] array;
int [] nyArr;
public IckeMain(int num) {
this.num = num;
}
public void fillArray () {
array = new int [num];
nyArr = new int [num];
System.out.println("You chose: " + num + " with size: " +array.length);
for (int j=0; j<num; j++) {
array[j] = (int)(Math.random() * 99);
System.out.println("Unsorted: " +array[j]);
}
}
public int getNum() {
return num;
}
}
在这里,您需要传递 num ,它是IckeMain构造函数中数组的大小。 因此,代替
IckeMain im = new IckeMain();
im.setNum(num);
您只需要一行:
IckeMain im = new IckeMain(num);
我希望这会有所帮助。
答案 2 :(得分:1)
您将需要利用构造函数作为面向对象编程的一部分来处理此问题。发生的情况是,当您首次启动程序时,正在运行用于设置数组大小的代码。然后,当您调用该方法时,已经创建了大小为零的数组。 我认为您并不精通对象,因此,我将提供一种解决方法。虽然,我还是建议您阅读面向对象的设计,因为它是一个非常强大的工具。
Igor的答案利用了构造函数和面向对象的编程,但是,如果您对此不熟悉,那么我会在此提醒您使用它。
在std::clog
方法中,您应该重新初始化数组,而不是在顶部。这样可以解决您的问题。
setNum()
答案 3 :(得分:1)
这里有些需要完全改变
public class IckeMain {
Scanner inread = new Scanner (System.in);
int num;
int [] array ;
int [] nyArr ;
/* this will initialize with 0 size since the default value of int is 0 means num=0
int [] array = new int [num];
int [] nyArr = new int [num];*/
public void fillArray () {
array = new int [num];
nyArr = new int [num];
System.out.println("You chose: " + num + " with size: " +array.length);
for (int j=0; j<num; j++) {
array[j] = (int)(Math.random() * 99);
System.out.println("Unsorted: " +array[j]);
}
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
答案 4 :(得分:0)
在初始化num的数组值时为0。 这就是为什么您在线程“ main”中获取异常java.lang.ArrayIndexOutOfBoundsException
我更改了您的代码,如下所示: 主班
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Write amount of numbers between 0-99: ");
int num = input.nextInt();
IckeMain im = new IckeMain(num);
im.setNum(num);
和IckeMain类
`
public class IckeMain {
int num;
int [] array;
int [] nyArr ;
public IckeMain(int num) {
array = new int [num];
nyArr = new int [num];
}
public void fillArray () {
System.out.println("You chose: " + num + " with size: " +array.length);
for (int j=0; j<num; j++) {
array[j] = (int)(Math.random() * 99);
System.out.println("Unsorted: " +array[j]);
}
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
`