好的。我不能自己看到这个,真是愚蠢,但是我被困住了。代码的第一块与发生错误的其余代码有关。提前致谢! :D

此代码确定将出现多少个怪物(数组的大小)。

    public static byte monsters()
{
    byte b = -7;                                //identifies how many monsters will be found

    chance = (byte)d20.nextInt(30);     //dice roll

    if(chance >= 24)
    {
        b = 4;          //quadruple monsters
    }
    else if(chance >= 18)
    {
        b = 3;          //triple monsters
    }
    else if(chance >= 12)
    {
        b = 2;          //double monsters
    }
    else if(chance >= 6)
    {
        b = 1;          //single monster
    }
    else
    {
        b = 0;          //no monster
    }
    return b;
}//end monsters()


该代码确定并生成要放置到阵列中的怪物。第一部分从上面的代码中获取输出以确定大小。第二部分生成怪物。当抛出“ NullPointerException”时,这就是它指向的代码,特别是“ for(x = 0; x

public void determineMons()
{
    byte x = 0;                         //counter

    switch(monsters())                  //defines the array
    {
        case 4:
            monsters = new Monster[4];
            break;

        case 3:
            monsters = new Monster[3];
            break;

        case 2:
            monsters = new Monster[2];
            break;

        case 1:
            monsters = new Monster[1];
            break;
    }//end switch

    for(x=0;x<monsters.length;x++)          //populates the array
    {
        chance = (byte)d20.nextInt(20);     //dice roll
        if(chance >= 15)
        {
            monsters[x] = new NazRuel();
        }
        else if(chance >= 10)
        {
            monsters[x] = new GiantSnake();
        }
        else if(chance >= 5)
        {
            monsters[x] = new Yeti();
        }
        else
        {
            monsters[x] = new Zombie();
        }
    }//end fill For
}//end determineMons()


这是“ ArrayOutOfBoundsExceptions”代码。但是,每次错误行都是“ monster =“行时,错误就会在不同情况之间跳动。

        determineMons();
    switch(Cell.monsters())
    {
        case 4:
            monster = "There is a " + monsters[0] + ", a " + monsters[1] + ", a " + monsters[2] + ", and a " + monsters[3] + " in this area!";
            break;

        case 3:
            monster = "There is a " + monsters[0] + ", a " + monsters[1] + ", and a " + monsters[2] + " in this area!";
            break;

        case 2:
            monster = "There is a " + monsters[0] + ", and a " + monsters[1] + " in this area!";
            break;

        case 1:
            monster = "There is a " + monsters[0] + " in this area!";
            break;
    }//end Monster block

最佳答案

NullPointerException

如果monsters()返回0,则变量monsters不会由开关初始化(既没有case 0也没有default),并且在for循环中执行NullPointerException时将生成monsters.length

另外,您应该更改开关:

switch(monsters())                  //defines the array
{
    case 4:
        monsters = new Monster[4];
        break;

    case 3:
        monsters = new Monster[3];
        break;

    case 2:
        monsters = new Monster[2];
        break;

    case 1:
        monsters = new Monster[1];
        break;
}


至:

int b = monsters();
if (b > 0) {
    monsters = new Monsters[b];
}


这不是错误,但是可以使您的代码更清晰。

超出范围的异常

您拨打monsters()两次。换句话说,首先调用monsters创建数组monsters(),然后使用另一个对monsters()的调用读取monsters的内容以确定元素数。

例如,假设在第一次调用monsters()时,返回的值是3。此时,您将创建一个包含3个元素的数组。当您要打印monsters的内容时,monsters()返回4。结果,当您尝试读取第四个元素时,您将发生超出范围的错误。

提醒一下,monsters()返回的值是随机的:

chance = (byte)d20.nextInt(30);     //dice roll


为了解决此问题,请尝试更改:

switch(Cell.monsters())




switch(monsters.length)

10-07 16:57