当前位置: 首页 > 知识库问答 >
问题:

使用变量声明数组大小会导致越界

柳业
2023-03-14

我正在创建一个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,为什么索引0会超出界限??

共有1个答案

薛彭薄
2023-03-14

虽然我们已经澄清了你得到例外的原因,但仍然有一个问题,如何修复它,以及如何避免这样的情况在未来发生。

让我们一步一步地看一下您的代码:

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];
}
 类似资料:
  • var remember bool = false if something { remember := true //错误 } // 使用remember 在此代码段中,remember变量永远不会在if语句外面变成true,如果something为true,由于使用了短声明:=,if语句内部的新变量remember将覆盖外面的remember变量,并且该变量的值为true,但是在if语

  • let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v

  • 问题内容: 我偶然发现了一个奇怪的问题,下面的代码无法编译: 错误(代码是linter推荐的代码)。: 注意,确实使用了该变量。 但是,如果我添加了else块-一切都会按预期编译: 这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11) 编辑:到目前为止的所有被告。按照:https : //golang.org/ref/spec#Short_variable_decl

  • 问题内容: 我正在使用Grails 1.1 beta2。我需要将大量数据导入Grails应用程序。如果我反复实例化grails域类然后保存它,则性能会降低到无法接受的程度。以从电话簿导入人为例: 事实证明这是缓慢的。Grails邮件列表上的某人建议在事务中分批保存。所以现在我有: 这必须至少在开始时更快。每笔交易会保存500条记录。随着时间的流逝,交易花费的时间越来越长。最初的几笔交易大约需要5秒

  • 我只使用了库中的几个实际类,即: 提前道谢。

  • 问题内容: 我正在尝试对MySQL 5.0中的变量进行一些简单的操作,但是我无法完全正常工作。我已经看到了很多(非常!)DECLARE / SET的不同语法,我不确定为什么……在任何情况下,我都可能会混淆它们/选择错误的语法/混合它们。 这是一个失败的最小片段: 我也尝试过使用BEGIN … END包装它;并作为一个程序。在这种情况下,MySQL Workbench会帮助我:第一行显示“’)’附近