Создание динамического массива, вызывающего исключение ArrayIndexOutOfBoundsException & NullPointerException

StackOverflow https://stackoverflow.com//questions/20008311

Вопрос

Хорошо.Я чувствую себя действительно глупо из-за того, что не могу увидеть это самостоятельно, но я застрял.Первый блок кода имеет отношение к остальной части кода, где возникают ошибки.Заранее спасибо!: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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top