为什么扫描仪功能不起作用?

时间:2017-07-25 00:52:38

标签: java arrays java.util.scanner

因此,此代码获取n的值并返回除数列表以及除数的总数。如果我删除Scanner声明及其赋值给int n并简单地给int n一个值,代码运行完美。

然而,实际上它会返回:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Program.main(Program.java:25)

我不知道问题是什么。

import java.util.Scanner;
public class Program{
    static int n;
    static int x = 1;
    static int [] arr = new int[n];
    static int q = 0;
    static int g = 0;
    static int p = 1;
    static int count;


    public static void main(String[] args){

         Scanner scan = new Scanner(System.in);
         int n = scan.nextInt();

         while(x <= n){

            arr [q] = p; //assigns value to each array index
            g = n%arr[q]; // stores value of remainder
            q++; 
            p++;
            x++;
            if (g == 0){ //counts and displays each time remainder  = 0
                count++;
                System.out.println(q);
            }

        }

        System.out.println(count + " Divisors");


}
}

3 个答案:

答案 0 :(得分:2)

arr仍然没有值(在输入大小之前)时,声明n的大小。这样做:

import java.util.Scanner;

public class Program {
    static int n;
    static int x = 1;
    static int [] arr; //no size set
    //...
    //Other variables
    //...

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        arr = new int[n]; //Now the size is set to the inputted number.
        while(x <= n) {
            //...
            //Other code to find divisors
            //...
        }
    }
}

您需要在输入arr后命名n 的大小,否则大小设置为0,从而导致ArrayIndexOutOfBoundsException }。

这一行:

arr[q] = p;

实际上是什么导致了错误。 arr[q]无法保留值,因为 没有arr[q]。阵列没有大小,所以它不能容纳任何成员。

答案 1 :(得分:1)

static int n;
...
static int [] arr = new int[n];

您没有给n一个值,因此它默认为0.因此,您将arr初始化为长度为0的数组。这就是您获得Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0的原因。这是因为你的数组大小为0,所以即使索引0超出了数组的范围。

如果您在阅读扫描仪之前不知道n,则应将代码更改为:

public static void main(String[] args){

     Scanner scan = new Scanner(System.in);
     int n = scan.nextInt();
     int [] arr = new int[n];
 ...
 }

答案 2 :(得分:0)

更改您的时间条件
while(x <= n)

while(x < n)

<意味着严格不到,所以你从1开始,而不是越界

编辑:

同样正如@CodingNinja所说,你必须改变并将一个int值定义为数组的大小,默认为0:

public static void main(String[] args){
     static int n;
     Scanner scan = new Scanner(System.in);
     int n = scan.nextInt();


     static int [] arr = new int[n];

     while(x <= n){

        arr [q] = p; //assigns value to each array index
        g = n%arr[q]; // stores value of remainder
        q++; 
        p++;
        x++;
        if (g == 0){ //counts and displays each time remainder  = 0
            count++;
            System.out.println(q);
        }

    }

    System.out.println(count + " Divisors");


  }