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

时间:2009-11-08 23:42:04

标签: 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); }
            }
        }
    }
}

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

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

感谢阅读。

编辑:

with:

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

在第二个循环中,没有打印任何内容。

但是:

            try{
                System.out.println("Coucou !");
                actionSquare[x][y].setIcon(bluesquare);

[...]                 }

“Coucou!”打印一次。 这就是为什么我说“似乎停在.setIcon()命令”我应该早点说,对不起。

5 个答案:

答案 0 :(得分:12)

以下是一些提示:

  • 不会捕获异常并且不对它们执行任何操作。这就是你在这两个循环中所做的事情,所以你没有看到错误信息是正常的。

  • 只要你看到像你这样的长语句,就应该暗示你可以重构它。例如,创建一个单独的方法来验证您是否要在循环中执行某些操作,然后在主要方法中将其称为if(shouldPerformAction())

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

  • 如果计算应该是固定的(例如this.moveAllowed*2

    imho,用this为所有方法/字段添加前缀毫无意义,它只会使一切变得混乱。只需直接调用方法即可。

答案 1 :(得分:5)

非常非常糟糕

catch(ArrayIndexOutOfBoundsException e){}

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

至少放在e.printStackTrace(),以查看问题是否发生以及在哪里。

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

答案 2 :(得分:3)

嗯......从哪里开始...

我建议先在System.err.println(...)块中添加一些内容(catch?)。或者只是完全评论它们,这样你就可以看到完整的堆栈跟踪。如果您遇到异常并且没有看到它会怎么样?

答案 3 :(得分:2)

catch(ArrayIndexOutOfBoundsException e){}

这是一种不好的做法,原因有两个:

  1. 你永远不应该抓住RuntimeException。它只是代码逻辑错误(即开发人员错误)的一个非常有用的指标,它应该通过编写良好的代码来解决。
  2. 除非你完全了解自己在做什么,否则永远不要忽视e。添加至少一个e.printStackTrace(),以便至少知道某些内容失败。

答案 4 :(得分:0)

我为你清理了你的代码。一般来说,如果你有两段代码应该做同样的事情,但不是,那么将它们转换成一种方法可以消除这种可能性。

public void showMovementCase(){
    // probably want to remove anything left over from the last invocation
    panel.removeAll();
    for (JLabel[] array : actionSquare) Arrays.fill(array, null);
     
    colorSquares(moveAllowed + attackDistance, redsquare, null);
    colorSquares(moveAllowed * 2, bluesquare, mouse);
     
    for (int x = 0; x < actionSquare.length; x++)
        for (int y = 0; y < actionSquare[x].length; y++)
            if (actionSquare[x][y] != null) panel.add(actionSquare[x][y], 1);
}
 
private void colorSquares(int move, Icon color, MouseListener mouse) {
    int xMax = Math.min(2 * move, actionSquare.length);
    int yMax = Math.min(2 * move, actionSquare[0].length);
    for (int x = 0; x < xMax; x++) {
        for (int y = 0; y < yMax; y++) {
            if (isLegal(x, y, move)) {
                if (actionSquare[x][y] == null)
                    actionSquare[x][y] = new JLabel();
                actionSquare[x][y].setIcon(color);
                actionSquare[x][y].setBounds(
                        sprite.getX() + (x - move) * 16,
                        sprite.getY() + (y - move) * 16, 16, 16 );
                if (mouse != null) actionSquare[x][y].addMouseListener(mouse);
            }
        }
    }
}
 
private static boolean isLegal(int x, int y, int move) {
    // informative comment explaining why this mess makes sense
    if (move <= y+x && move >= y-x && x <= move) return true;
    // informative comment explaining why this mess makes sense
    if (move <= y+x && move >= x-y && x > move && y <= move) return true;
    // informative comment explaining why this mess makes sense
    if (move * 3 >= y+x && move >= y-x && x > move &&  y >= move) return true;
     
    return false;
}