非常大的,特定的2d数组for循环在随机点中返回空值

时间:2013-11-17 20:51:27

标签: java arrays

基于一组非常具体的标准,我有一个巨大的双循环来填充二维数组。我在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

1 个答案:

答案 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);
}

然后,运行您的程序,找出错过的组合并追踪它。然后继续编码并处理代码结构,因为它可以变得更好,但通常需要练习。