好的。我不能自己看到这个,真是愚蠢,但是我被困住了。代码的第一块与发生错误的其余代码有关。提前致谢! :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
),并且在for循环中执行NullPointerException
时将生成monsters.length
。
另外,您应该更改开关:
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
。结果,当您尝试读取第四个元素时,您将发生超出范围的错误。提醒一下,
monsters()
返回的值是随机的:chance = (byte)d20.nextInt(30); //dice roll
为了解决此问题,请尝试更改:
switch(Cell.monsters())
至
switch(monsters.length)