Criação dinâmica de array causando ArrayIndexOutOfBoundsException e NullPointerException
-
20-12-2019 - |
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
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)