当有两个for()循环时,第二个不起作用

POS*_*DER 0 java

这是我的for()循环:

public void showMovementCase(){
    int movePlusAttack = moveAllowed+attackDistance;
    int twiceMoveAllowed = (moveAllowed)*2;
    for(int i = 0; i <= movePlusAttack*2; i++){
        for(int j = 0; j <= movePlusAttack*2;j++){
            boolean a = movePlusAttack <= j+i && movePlusAttack >= j-i && i <= movePlusAttack;
            boolean b = movePlusAttack <= j+i && movePlusAttack >= i-j && i > movePlusAttack && j <= movePlusAttack;
            boolean c = movePlusAttack*3 >= j+i && movePlusAttack >= j-i && i > movePlusAttack &&  j >= movePlusAttack;
            if(a || b || c){
                try{
                    actionSquare[i][j] = new JLabel();
                    actionSquare[i][j].setIcon(redsquare);
                    actionSquare[i][j].setBounds(sprite.getX()+(i-movePlusAttack)*16,sprite.getY()+(j-movePlusAttack)*16, 16, 16);
                    panel.add(actionSquare[i][j], new Integer(1));
                }
                catch(ArrayIndexOutOfBoundsException e){System.out.println("red :" + e);}
            }
        }
    }
    for(int x = 0; x <= twiceMoveAllowed; x++){
        for(int y = 0; y <= twiceMoveAllowed;y++){
            boolean a = moveAllowed <= y+x && moveAllowed >= y-x && x <= moveAllowed;
            boolean b = moveAllowed <= y+x && moveAllowed >= x-y && x > moveAllowed && y <= moveAllowed;
            boolean c = moveAllowed*3 >= y+x && moveAllowed >= y-x && x > moveAllowed &&  y >= moveAllowed;
            if(a || b || c){
                try{
                    actionSquare[x][y].setIcon(bluesquare);
                    System.out.println("Coucou !");
                    actionSquare[x][y].addMouseListener(mouse);
                    panel.repaint();
                    panel.revalidate();
                }
                catch(ArrayIndexOutOfBoundsException e){System.out.println("blue :" + e); }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果this.attackDistance不同于0,则第二个循环不起作用(它似乎停在.setIcon()命令处).

你知道解决这个问题的方法吗?

谢谢阅读.

编辑:

用:

                try{
                    actionSquare[x][y].setIcon(bluesquare);
                    System.out.println("Coucou !");
[...]
                }
Run Code Online (Sandbox Code Playgroud)

在第二个循环中,不打印任何内容.

但是:

            try{
                System.out.println("Coucou !");
                actionSquare[x][y].setIcon(bluesquare);
Run Code Online (Sandbox Code Playgroud)

[...]}

"库库!" 打印一次.这就是为什么我说"似乎停止了.setIcon()命令"我应该早点说,对不起.

JRL*_*JRL 12

以下是一些提示:

  • 不要抓住异常而不对它们采取任何措施.这就是你在这两个循环中所做的事情,所以你没有看到错误信息是正常的.

  • 任何时候你看到像你这样的冗长陈述,它应该是你可以重构它的暗示.例如,创建一个单独的方法来验证您是否要在循环中执行某些操作,然后在main方法中将其称为if(shouldPerformAction())

  • 考虑使用少于8个空格进行缩进.这只会占用你的屏幕空间.

  • 考虑在循环之前而不是在循环条件内进行计算,如果计算应该是固定的(例如this.moveAllowed*2)

  • imho,没有必要为你的所有方法/字段添加前缀this,它只会使一切变得混乱.只需直接调用方法即可.


Joa*_*uer 5

这是一个非常非常糟糕的主意:

catch(ArrayIndexOutOfBoundsException e){}
Run Code Online (Sandbox Code Playgroud)

您有效地告诉JVM忽略它检测到的阵列的任何问题.更糟糕的是:当发生这种情况时,你甚至不打印任何东西.

至少放一个e.printStackTrace()在那里看看是否出现问题以及在哪里.

并且作为进一步的步骤:修复您的阵列访问不超过任何限制.抓住一个ArrayIndexOutOfBoundsException是一个非常糟糕的主意.避免把它扔掉!