将数组大小设置为来自另一个类的用户输入

时间:2018-08-19 20:11:12

标签: java arrays

我有一个主类,要求用户输入数字(整数)。该数字将是另一个类中数组的大小。我将使用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,该数组似乎无法“获取”该数字。为什么?

5 个答案:

答案 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;
}
}

`