【问题标题】:Java - array initialization with user specified sizeJava - 用户指定大小的数组初始化
【发布时间】:2014-04-02 21:15:42
【问题描述】:

我正在尝试创建一个程序,该程序从用户输入接收数组的大小,然后接受该数量的整数,然后显示其中的所有素数。因此,例如,如果用户输入他们希望数组大小为 5,那么它应该允许用户输入 5 个整数。但是我被卡住了,这给了我一个错误。

import java.util.Scanner;

public class arrayprime {

public static void main (String[] Args)
{   
    boolean isprime = true;
    int i=0;
    int[] Array = new int[i];
    Scanner keyboard = new Scanner (System.in);
    System.out.println("Please enter how large you want the array to be: ");
    i = keyboard.nextInt();

    for (int j=0; j<i; j++)
    {
        System.out.println("Please enter an integer: ");
        Array[j] = keyboard.nextInt();
    }

    int k = 2;
    while (k <= Math.sqrt(Array[i]))
    {
        if (Array[i] % k == 0)
        {
            isprime = false;
            break;
        }
        k++;
    }
    if (isprime==true)
    {
        System.out.println(Array[i] + "is prime.");
    }
}
}

我得到的错误是:

     "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at arrayprime.main(arrayprime.java:18)"

【问题讨论】:

  • 先询问大小,然后创建数组。

标签: java arrays initialization array-initialization


【解决方案1】:

阅读您的代码:

int i=0;
int[] Array = new int[i]; //--> Array = new int[0]

...
while (k <= Math.sqrt(Array[i])) //"i" can be any number, but Array has size 0.

移动

i = keyboard.nextInt();

Array初始化之前

【讨论】:

  • 感谢工作。但是现在我对这一行有另一个问题 - " int k = 2; while (k
  • @user2444400 哪个问题?
  • " 线程 "main" 中的异常 java.lang.ArrayIndexOutOfBoundsException: 5 at arrayprime.main(arrayprime.java:28)" 和第 28 行中的值的平方根的初始化数组[i]
  • @user2444400 我明白了。 Java 索引是从零开始的。所以,如果你有一个大小为5 的数组,那么4 是最后一个可用的索引。当您请求Math.sqrt(Array[i]) 时,您调用的是Math.sqrt(Array[5]),它不存在:最后一个可用索引是Array[4]
  • 啊,好吧,现在我在循环中将它设置为 Array[i-1],效果很好。谢谢!
【解决方案2】:

在检查所有素数时,您需要遍历整个数组。

一旦你知道你想要它有多大,你还应该初始化数组。

最后,您需要考虑小于 2 的数字不是素数。

如果您进行这些更改,您应该会得到如下结果:

import java.util.Scanner;

public class arrayprime {

public static void main (String[] Args)

{   
    boolean isprime = true;
    int i=0;
    Scanner keyboard = new Scanner (System.in);
    System.out.println("Please enter how large you want the array to be: ");
    i = keyboard.nextInt();
    int[] Array = new int[i];
    keyboard.nextLine();

    for (int j=0; j<i; j++)
    {
        System.out.println("Please enter an integer: ");
        Array[j] = keyboard.nextInt();
        keyboard.nextLine();

    }


    for (i = 0; i < Array.length; i++){
        int k = 2;
        if (Array[i] < 2){
            isprime = false; 
        }
                else{
            while (k <= Math.sqrt(Array[i]))
            {
                if (Array[i] % k == 0)
                {
                    isprime = false;
                    break;
                }
                k++;
            }
                }
        if (isprime)
        {
           System.out.println(Array[i] + " is prime.");
        }
        isprime = true;
    }


}
}

我相信这符合您的要求。

编辑:我之前遇到过 Scanner.nextInt() 的问题,因为它在队列中留下了一个空白空间,该空间会在下一个 Scanner.next___() 被拾取,所以我倾向于避免使用它。但这只是个人选择。

我希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    这里

    int i=0;
    int[] Array = new int[i];
    

    您为阵列保留存储空间,但此时 i 仍为 0

    所以数组的长度为0 而你
    尝试向其添加元素时失败。

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2015-07-28
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      相关资源
      最近更新 更多