Создание динамического массива, вызывающего исключение ArrayIndexOutOfBoundsException & NullPointerException
-
20-12-2019 - |
Вопрос
Хорошо.Я чувствую себя действительно глупо из-за того, что не могу увидеть это самостоятельно, но я застрял.Первый блок кода имеет отношение к остальной части кода, где возникают ошибки.Заранее спасибо!: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
) и сгенерирует NullPointerException
когда ты это сделаешь monsters.length
в цикле for.
Кроме того, вам следует сменить свой переключатель:
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
.Как следствие, вы получите ошибку out of bound при попытке прочитать 4-й элемент.
Напомним, что значение, возвращаемое monsters()
является случайным:
chance = (byte)d20.nextInt(30); //dice roll
Чтобы устранить эту проблему, попробуйте изменить:
switch(Cell.monsters())
к
switch(monsters.length)