【问题标题】:Set array size to user input from another class将数组大小设置为来自另一个类的用户输入
【发布时间】:2018-08-19 20:11:11
【问题描述】:

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

【问题讨论】:

    标签: java arrays


    【解决方案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】:

      这是因为你的数组声明 -

      int [] array = new int [num];
      int [] nyArr = new int [num];
      

      在 num = 0 时发生。在将 num 值设置为 5 后不会发生这些初始化。因此,索引 0 的差异和 ArrayIndexOutOfBoundsException 本身作为声明的数组实际上是空的,根本没有大小。

      你可以的

      array = new int[num];
      nyArr = new int [num];
      

      在setNum()方法中,使num的新值反映在数组大小中。

      【讨论】:

        【解决方案3】:

        您需要利用构造函数作为面向对象编程的一部分来处理这个问题。发生的情况是,当您第一次启动程序时,正在运行设置数组大小的代码。然后,当您调用该方法时,已经创建了大小为零的数组。 但是,我认为您并不精通对象,因此我将提供一种解决方法。不过,我建议阅读面向对象的设计,因为它是一个非常强大的工具。

        Igor 的回答利用了构造函数和面向对象的编程,但是如果这不是您熟悉的东西,那么我会提醒您目前使用它。

        在您的setNum() 方法中,您应该重新初始化数组,而不是在顶部。这将解决您的问题。

        public class IckeMain {
        Scanner inread = new Scanner (System.in);
        int num;
        
        //Make sure to declare your array up here, but don't worry about setting a value
        int [] array; 
        int [] nyArr;
        
        
        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;
            //Now initialize to a new array with size num
            array = new int [num];
            nyArr = new int [num];
        }
        

        【讨论】:

          【解决方案4】:

          这里有一些需要完整的改变

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

          【讨论】:

            【解决方案5】:

            在数组初始化时 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;
            }
            }
            

            `

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多