使用变量声明数组大小会导致超出范围异常

时间:2018-04-06 14:32:04

标签: java arrays setter variable-declaration

我正在创建一个int数组secretNumber。当我将数组大小声明为数字时,没有超出范围的异常,但是当我使用变量(numDigits)声明数组大小时,我在索引0处获得了行'secretNumber [i] = val的超出范围异常”。这是班级:

import java.util.Random;
import java.util.Scanner;

public class Engine {
    public int numDigits;
    public int[] secretNumber = new int[numDigits]; //this is the array
    public Random randomNumberGenerator;

    public void setNumDigits() {
        Scanner setNumDigits = new Scanner(System.in);
        System.out.println("Enter the number of digits to use");
        String numDigits = setNumDigits.nextLine();
        this.numDigits = Integer.parseInt(numDigits);
    }

    public int getNumDigits() {
        return this.numDigits;
    }

    public void generateNewSecret() {
        int val;
        for (int i = 0; i < numDigits - 1; i++) {
            Random rand = new Random();
            val = rand.nextInt(9);
            secretNumber[i] = val; //out of bounds exception is here
        }
    }

    public void setSecretNumber(int[] secretNumberCopy) {
        secretNumberCopy.equals(this.secretNumber);
    }

    public int[] getSecretNumber() {
        return secretNumber;
}



}

这是执行方法的主要方法,我在设置数组之前运行numDigits setter:

import java.util.Scanner;

public class Bagels {
    public static void main(String[] args) {

        Player playerOne = new Player();

        playerOne.setName();

        System.out.println(playerOne.getName());

        Engine engine = new Engine();

        engine.setNumDigits();
        engine.setSecretNumber(engine.secretNumber);
        engine.generateNewSecret();

        System.out.println(engine.getSecretNumber());


    }
}

如果我设置了numDigits,为什么Index 0会超出范围?

2 个答案:

答案 0 :(得分:0)

正如其他人所评论的那样,您正在使用变量创建数组,但该变量保留为默认的整数值,即0。相反,在您知道所需的大小之前,请不要创建数组。这将解决您的问题。

public class Engine {
    public int numDigits;
    public int[] secretNumber; // leave empty
    public Random randomNumberGenerator;

    public void setNumDigits() {
        Scanner setNumDigits = new Scanner(System.in);
        System.out.println("Enter the number of digits to use");
        String numDigits = setNumDigits.nextLine();
        this.numDigits = Integer.parseInt(numDigits);
        secretNumber = new int[this.numDigits]; // build it here
    }
}

作为最后一点,如果我输入一个字符串或一个double而不是整数,你的代码会发生什么?考虑这样的常见用例总是一个好主意。

答案 1 :(得分:0)

虽然我们已经澄清了您获得例外的原因,但仍有一个问题如何解决它以及如何在将来避免此类情况。

让我们一步一步地完成您的代码:

Engine engine = new Engine();

创建新engine对象,将所有类变量实例化为其默认值。原始int的默认值为0;

在初始化的那一刻,你有:

public int numDigits; // 0
public int[] secretNumber = new int[numDigits]; // arrays object of size 0
public Random randomNumberGenerator; // null

如何处理?

问题部分在于对象设计 - 您需要识别约束状态变量的不变量。您需要在numDigits初始化期间设置数组的大小:

public int[] secretNumber; // null at the moment of object initialization

public void setNumDigits() {
    Scanner setNumDigits = new Scanner(System.in);
    System.out.println("Enter the number of digits to use");
    numDigits = Integer.parseInt(setNumDigits.nextLine());
    secretNumber = new int[numDigits];
}