Pergunta

Tudo bem.Eu me sinto muito estúpido por não ser capaz de ver isso sozinho, mas estou preso.O primeiro bloco de código é pertinente ao restante do código, onde ocorrem os erros.Desde já, obrigado!:D

Este código determina quantos monstros (o tamanho do array) estarão presentes.

    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()

Este código determina e gera os monstros a serem colocados no array.A primeira parte obtém a saída do código acima para determinar o tamanho.A segunda parte gera os monstros.Quando o "NullPointerException" é lançado, este é o código para o qual ele aponta, especificamente o "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()

Aqui está o código "ArrayOutOfBoundsExceptions".O erro está saltando entre os diferentes casos, cada vez que a linha de erro é a linha "monstro =".

        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
Foi útil?

Solução

A NullPointerException

Se monsters() retorna 0, a variável monstros não é inicializada pelo switch (não há case 0 nem default) e gerará um NullPointerException quando você faz monsters.length no loop for.

Além disso, você deve alterar sua opção:

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;
}

para:

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

Não é um bug, mas isso tornaria seu código mais claro.

A exceção fora do limite

Você chama monsters() duas vezes.Em outras palavras, você cria o array monsters com a primeira chamada para monsters() e você leu o conteúdo de monsters usando outra chamada para monsters() para determinar o número de elementos.

Por exemplo, digamos que na primeira chamada para monsters(), o valor retornado é 3.Neste momento, você cria um array de 3 elementos.E quando você quiser imprimir o conteúdo de monsters, monsters() retorna 4.Como consequência, você cometerá um erro fora do limite ao tentar ler os 4º elementos.

Lembrando que o valor retornado por monsters() é aleatório:

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

Para resolver esse problema, tente alterar:

switch(Cell.monsters())

para

switch(monsters.length)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top