Frage

In Ordnung.Ich komme mir wirklich dumm vor, weil ich das nicht selbst sehen kann, aber ich stecke fest.Der erste Codeblock ist für den Rest des Codes relevant, in dem die Fehler auftreten.Dank im Voraus!:D

Dieser Code bestimmt, wie viele Monster (die Größe des Arrays) vorhanden sein werden.

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

Dieser Code bestimmt und generiert die Monster, die in das Array eingefügt werden sollen.Der erste Teil verwendet die Ausgabe des obigen Codes, um die Größe zu bestimmen.Der zweite Teil erzeugt die Monster.Wenn die „NullPointerException“ ausgelöst wird, ist dies der Code, auf den sie zeigt, insbesondere „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()

Hier ist der Code „ArrayOutOfBoundsExceptions“.Der Fehler springt zwischen den verschiedenen Fällen hin und her, wobei die Fehlerzeile jedoch jedes Mal die Zeile „monster =" ist.

        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
War es hilfreich?

Lösung

Die NullPointerException

Wenn monsters() Gibt 0 zurück, die Variable Monsters wird nicht durch den Schalter initialisiert (es gibt keine case 0 noch default) und erzeugt eine NullPointerException wenn Sie das tun monsters.length in der for-Schleife.

Außerdem sollten Sie Ihren Schalter ändern:

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

Zu:

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

Es ist kein Fehler, aber das würde Ihren Code klarer machen.

Die Out-of-Bound-Ausnahme

Du rufst an monsters() zweimal.Mit anderen Worten: Sie erstellen das Array monsters mit dem ersten Anruf an monsters() und Sie lesen den Inhalt von monsters Verwenden eines weiteren Aufrufs von monsters(), um die Anzahl der Elemente zu bestimmen.

Nehmen wir zum Beispiel an, dass beim ersten Anruf an monsters(), der zurückgegebene Wert ist 3.In diesem Moment erstellen Sie ein Array aus 3 Elementen.Und wenn Sie den Inhalt ausdrucken möchten monsters, monsters() kehrt zurück 4.Infolgedessen kommt es beim Versuch, das vierte Element zu lesen, zu einem Fehler, der außerhalb des zulässigen Bereichs liegt.

Zur Erinnerung: Der von zurückgegebene Wert monsters() ist zufällig:

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

Um dieses Problem zu beheben, versuchen Sie Folgendes zu ändern:

switch(Cell.monsters())

Zu

switch(monsters.length)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top