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

我一直得到错误"索引5出界长度5"但不知道要改变什么

壤驷华辉
2023-03-14

我对编码很陌生,所以请耐心听我说,我只是在尝试洗牌数组的方法,以便最终在我Java创建的纸牌游戏中洗牌。我知道索引5超出了长度5的范围,但令我困惑的是错误并不总是会弹出。有时我试图运行我的代码,它工作得很好,有时我得到了错误,即使我在运行它的两次之间没有改变任何东西。

public class Card{

    public static void shuffle(Object[] array) {

        int noOfCards = array.length;

        for (int i = 0; i < noOfCards; i++) {

            int s = i + (int)(Math.random() * (noOfCards - 1));

            Object temp = array[s]; //this is the first line it says has a problem
            array[s] = array[i];
            array[i] = temp;
        }
    }

    public static void main(String[] args) {

        String[] strOfCards = {"A","B","C","D","E"};

        Card.shuffle(strOfCards); //this is the second line that has a problem
        for(int i = 0; i < strOfCards.length; i++) {
            System.out.println(strOfCards[i] + " ");
        }
    }
}

我不知道如何更改有缺陷的线条,欢迎提出任何建议!***我尝试过更改字符串中的字母数,但错误随之改变,即“索引6超出长度6的界限”

共有3个答案

滑文昌
2023-03-14

以下是导致问题的原因:

int s = i + (int)(Math.random() * (noOfCards - 1));

只要s值为

例如i可以是3,如果Math.random()返回类似于0.5的东西,那么3(int)(0.5*4)等于5,这是出界的(0...4)

这种情况并不总是发生,因为有时Math.random()生成的数字足够小,所以s的求值小于5。

为了确保s的值总是在范围内(0...4),您应该将结果取模为5。

这条线应该是这样的:

int s = (i + (int)(Math.random() * (noOfCards - 1))) % 5;
壤驷高洁
2023-03-14

长度为N的数组的最大索引为(N-1)。代码应该是这样的:

public static void shuffle(Object[] array) {
    int noOfCards = array.length;
    Random random = new Random();
    for (int i = 0; i < noOfCards; i++) {
        int s = random.nextInt(noOfCards);

        Object temp = array[s];
        array[s] = array[i];
        array[i] = temp;
    }
}
齐昆
2023-03-14

考虑行:

for (int i = 0; i < noOfCards; i++) {
    int s = i + (int)(Math.random() * (noOfCards - 1));
    Object temp = array[s]; //this is the first line it says has a problem

你的随机数表达式从0到noOfCards-2不等,所以s从0到(2*noOfCards)-3不等

然后,array[s]将在

并不是每次你运行它都会发生,因为有时候随机数都碰巧在noOfCards下

如果您想与其他随机卡交换,则可以尝试:

Random random = new Random();
int s = (i + random.nextInt(noOfCards - 1)) % noOfCards;

我知道你在利用这个机会学习,但如果你不知道的话,这里有一个集合。shuffle方法,可用于在一个命令中洗牌集合,如ArrayList

 类似资料:
  • 我对编码还是个新手,所以请耐心听我说,我只是在尝试一些方法来洗牌一个数组,以便最终在我用Java创建的纸牌游戏中洗牌。我知道索引5超出了长度5的界限,但令我困惑的是错误并不总是弹出。有时我试着运行我的代码,它工作得很好,而另一些时候,即使我在运行代码期间没有更改任何内容,我也会出现错误。 我不知道如何改变有缺陷的线条,任何建议都欢迎!***我尝试更改字符串中的字母数,但错误随之改变,即“索引6 o

  • 我正在努力创造这个游戏https://en.wikipedia.org/wiki/Conway然而,每当我尝试使用printBoard方法时,我都会遇到以下错误 线程“main”java中出现异常。lang.ArrayIndexOutOfBoundsException:索引5超出长度5的界限。 我怎样才能解决这个问题?谢谢

  • 这个错误开始突然出现,当我登录到我的应用程序(通过firebase)时,它必须显示一个列表,然而,当登录时,它没有显示任何东西,并且这个错误开始在日志中出现几次 日志: 我看不到这个错误来自什么activity或片段,我只知道当我之后登录到我的列表时,它在列表中没有显示任何东西并且这些错误在日志中以一行的形式出现

  • 我正在阅读Al Sweigart的书《自动化无聊的东西》,我对我遇到的索引错误感到不知所措。我正在使用PyPDF2尝试打开一个加密的PDF文档。我知道这本书是2015年的,所以我去了文档,看看我是否遗漏了什么,一切似乎都一样,至少据我所知。所以我不确定这里出了什么问题。 给予: 在问我的问题之前,我在谷歌上搜索了一下,找到了这个带有“建议修复”的链接。然而,我对这一点很陌生,想看看解决方法是什么。

  • 我有一个方法,我输入一个包含4个对象的数组,它创建一个新的对象数组,复制之前的4个对象,然后再向数组中添加一个。但我一直有例外。

  • 我编写了这段代码,将整个以10为基数的数字转换成二进制。我相信代码就是它所需要的一切,但我无法让工作。 我在这个网站和其他网站上花了几个小时,尝试了无数次的修改,但都没有用。 我已经让代码无错误地编译,但一旦我运行它并输入程序就会崩溃。 下面是代码: 这些是java在我输入数字时抛出的异常。 我希望这是足够的信息。