【问题标题】:How to prevent StackOverflowError in minesweeper program?如何防止扫雷程序中的 StackOverflowError?
【发布时间】:2015-05-12 15:36:10
【问题描述】:

我制作了一个程序,旨在像扫雷游戏一样运行。它被设置为 GridLayout,并且在主代码中有一个名为 getNumberSmall 的递归代码,当单击按钮时运行。它不会递归运行,除非单击的按钮是空白区域(即,如果您曾经玩过扫雷游戏,既不是地雷也不是数字)。单击空白区域时,代码应该在单击的空白按钮周围的按钮上递归运行。但是,当我这样做时,会出现堆栈溢出错误。我应该如何解决这个问题?

public void getNumberSmall(JButton b3){
    JButton above = new JButton();
    JButton below = new JButton();
    JButton right = new JButton();
    JButton left = new JButton();
    JButton DRight = new JButton();
    JButton DLeft = new JButton();
    JButton DRightD = new JButton();
    JButton DLeftD = new JButton();
    JButton clicked = b3;
    int myX = (int) clicked.getClientProperty("column");
    int myY = (int) clicked.getClientProperty("row");
    int mNum = 0;

    if(myX < 9){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") - 1 == myX){
                if((int) small.get(i).getClientProperty("row") == myY){
                    right = small.get(i);
                    if((int)right.getClientProperty("enabled") == 1){
                        right = null;
                    }
                }

            }
        }
    }
    else{
        right = null;
    }

    if(myX > 1){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") + 1 == myX){
                if((int) small.get(i).getClientProperty("row") == myY){
                    left = small.get(i);
                    if((int)left.getClientProperty("enabled") == 1){
                        left = null;
                    }
                }

            }
        }
    }
    else{
        left = null;
    }

    if(myY < 9){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") == myX){
                if((int) small.get(i).getClientProperty("row") - 1 == myY){
                    below = small.get(i);
                    if((int)below.getClientProperty("enabled") == 1){
                        below = null;
                    }
                }

            }
        }
    }
    else{
        below = null;
    }

    if(myY > 1){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") == myX){
                if((int) small.get(i).getClientProperty("row") + 1 == myY){
                    above = small.get(i);
                    if((int)above.getClientProperty("enabled") == 1){
                        above = null;
                    }
                }

            }
        }
    }
    else{
        above = null;
    }

    if(myY == 9){
        DRightD = null;
        DLeftD = null;
    }
    if(myY == 1){
        DRight = null;
        DLeft = null;
    }
    if(myX == 9){
        DRightD = null;
        DRight = null;
    }
    if(myX == 1){
        DLeftD = null;
        DLeft = null;
    }
    if(DRight != null){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") - 1 == myX){
                if((int) small.get(i).getClientProperty("row") + 1 == myY){
                    DRight = small.get(i);
                    if((int)DRight.getClientProperty("enabled") == 1){
                        DRight = null;
                    }
                }

            }
        }
    }

    if(DLeft != null){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") + 1 == myX){
                if((int) small.get(i).getClientProperty("row") + 1 == myY){
                    DLeft = small.get(i);
                    if((int)DLeft.getClientProperty("enabled") == 1){
                        DLeft = null;
                    }
                }

            }
        }
    }

    if(DRightD != null){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") - 1 == myX){
                if((int) small.get(i).getClientProperty("row") - 1 == myY){
                    DRightD = small.get(i);
                    if((int)DRightD.getClientProperty("enabled") == 1){
                        DRightD = null;
                    }
                }

            }
        }
    }

    if(DLeftD != null){
        for(int i = 0; i < small.size(); i++){
            if((int) small.get(i).getClientProperty("column") + 1 == myX){
                if((int) small.get(i).getClientProperty("row") - 1 == myY){
                    DLeftD = small.get(i);
                    if((int)DLeftD.getClientProperty("enabled") == 1){
                        DLeftD = null;
                    }
                }

            }
        }
    }

    if(above != null){
        if((int) above.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }
    if(below != null){
        if((int) below.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }
    if(right != null){
        if((int) right.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }
    if(left != null){
        if((int) left.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }
    if(DRight != null){
        if((int) DRight.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }
    if(DLeft != null){
        if((int) DLeft.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }
    if(DRightD != null){
        if((int) DRightD.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }
    if(DLeftD != null){
        if((int) DLeftD.getClientProperty("mines") == 1){
            mNum = mNum + 1;
        }
    }

    if(mNum == 0){
        String num2 = "" + mNum;
        clicked.setText(num2);

        if((above != null) && ((int)above.getClientProperty("enabled") == 0)){
        getNumberSmall(above);
        above.putClientProperty("enabled", 1);
        }

        if((below != null) && ((int)below.getClientProperty("enabled") == 0)){
        getNumberSmall(below);
        below.putClientProperty("enabled", 1);
        }

        if((right != null) && ((int)right.getClientProperty("enabled") == 0)){
        getNumberSmall(right);
        right.putClientProperty("enabled", 1);
        }

        if((left != null )  && ((int)left.getClientProperty("enabled") == 0)){
        getNumberSmall(left);
        left.putClientProperty("enabled", 1);

        }

        if((DRight != null)  && ((int)DRight.getClientProperty("enabled") == 0)){
        getNumberSmall(DRight);
        DRight.putClientProperty("enabled", 1);

        }

        if((DLeft != null)  && ((int)DLeft.getClientProperty("enabled") == 0)){
        getNumberSmall(DLeft);
        DLeft.putClientProperty("enabled", 1);

        }

        if((DRightD != null)  && ((int)DRightD.getClientProperty("enabled") == 0)){
        getNumberSmall(DRightD);
        DRightD.putClientProperty("enabled", 1);

        }

        if((DLeftD != null)  && ((int)DLeftD.getClientProperty("enabled") == 0)){
        getNumberSmall(DLeftD);
        DLeftD.putClientProperty("enabled", 1);

        }


    }

    else{
    String number = "" + mNum;
    clicked.setText(number);
    }
}

【问题讨论】:

  • 尝试运行你的调试器。您也许能够找出为什么递归不会停止。但如果我不得不猜测,那可能是因为你在调用getNumberSmall 之前调用了putClientProperty
  • TNT- 你是对的!我切换了 getNumberSmall 和 putClientProperty (在所有这些都将单击的按钮设置为启用之前)并且它有效!谢谢!

标签: java recursion stack-overflow


【解决方案1】:

单击按钮上似乎没有启用任何设置,因此没有什么可以阻止递归循环进行。

例如:点击 -> 上方 -> 下方 -> 上方 ....

【讨论】:

    【解决方案2】:
    getNumberSmall(above);
    above.putClientProperty("enabled", 1);
    

    这里,在putClientProperty 之前有getNumberSmall 将导致程序调用getNumberSmall 以使用指定的按钮而不对所反映的按钮进行任何更改,这会导致递归继续直到抛出 StackOverflowError。如果切换两个方法调用,JButton 的指定属性会在按钮作为参数传递之前发生变化,并且这种变化会反映在 JButton 参数上。

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多