基于一组非常具体的标准,我有一个巨大的双循环来填充二维数组。我在JOptionPane中显示这个2d数组;在程序的某些运行中,我得不到“null”,在其他程序上,我得到了很多。似乎没有出现在何时/何时发生的模式。
这让我相信我的问题必须处理我的“其他如果”标准。
我的数组中填充了不同的字符串,具体取决于:如果单元格中有怪物,是否有一块护甲,是否有武器,是否有什么,或者是否有任何组合的组合以上(怪物+武器,怪物+护甲等)。
这导致我制作以下if / else if链:
if(map[a][b] == map[0][0]) //sets the first cell as the entrance
...
else if(!x.hasAM() && armour == 0 && weapons == 0) //has nothing
...
else if(!x.hasAM() && armour > 0 && weapons == 0) //has armour
...
else if(!x.hasAM() && armour == 0 && weapons > 0) //has weapon
...
else if(x.hasAM() && armour == 0 && weapons == 0) //has monster
...
else if(x.hasAM() && armour > 0 && weapons == 0) //has monster, has armour
...
else if(x.hasAM() && armour == 0 && weapons > 0) //has monster, has weapon
...
else if(x.hasAM() && armour > 0 && weapons > 0) //has monster, has armour, has weapon
在其中一些中,我分配字符串的方式只是“map [a] [b] =”| ________ |“;”。在其他人中,我有嵌套的开关。我不认为这是问题,因为嵌套交换机生成的字符串有效。但显然我不知道问题是什么,所以以下是最“复杂”设置的例子:
else if (Player.type.equalsIgnoreCase("Ranger")) {
if (Cell.monsters.length == 4) {
switch (weapons) {
case 1:
switch (armour) {
case 1:
map[a][b] = "|_!Sl@L__XXXX|";
break;
case 2:
map[a][b] = "|_!Sl@C__XXXX|";
break;
case 3:
map[a][b] = "|_!Sl@P__XXXX|";
break;
case 4:
map[a][b] = "|_!Sl@M__XXXX|";
break;
}
break;
}
}
}
我遇到的问题是,有时我的程序输出是这样的:
|_!Sl@M__XXXX| |_!Sl@M__XXXX| null null |_!Sl@M__XXXX|
null |_!Sl@M__XXXX| |_!Sl@M__XXXX| null null
等
以下是完整的方法,如果我错误地认为它是我的“else if”语句并且你想看看整个事情:https://gist.github.com/anonymous/7518098
和往常一样,提前谢谢! :d
答案 0 :(得分:0)
好。在你的长if
- else if
链中,你显然缺少一些盔甲,玩家类型,武器和怪物数量的组合。我们可以尝试详细分析它,但是代码的结构使得这很难做到。 (关于重构代码的评论是关键的,即使你还不知道如何做到这一点)
因此,让我们让程序告诉我们错过了什么组合。
我建议你在第1275行添加它,就在“builder.append”行之前:
if (map[a][b] == null) {
System.out.println("Missed case! Player.type is " + Player.type
+ " and weapons is " + weapons
+ " and armour is " + armour
+ " and Cell.monsters.length is " + Cell.monsters.length);
}
然后,运行您的程序,找出错过的组合并追踪它。然后继续编码并处理代码结构,因为它可以变得更好,但通常需要练习。