我正在创建一个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会超出范围?
答案 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];
}