如何在C#中避免或处理堆栈溢出异常?

时间:2014-05-30 10:03:34

标签: c# exception stack overflow

如何在此代码中避免或处理堆栈溢出异常? (C#语言)

    public void expand(int i, int j)
    {
        int dan = danger(i, j);
        if (dan == 0)
        {
            button_show(i, j, "");
            if (i != 0)
                expand(i - 1, j);
            if (i != 7)
                expand(i + 1, j);
            if (j != 0)
                expand(i, j - 1);
            if (j != 7)
                expand(i, j + 1);
        }
        else if (dan > 0 && dan < 9)
        {
            button_show(i, j, dan.ToString());
        }


    }

此方法发生异常

    public void button_show(int i, int j, string danger)
    {
            this.Controls["b" + i + "n" + j].Text = danger;//this line throw an stack overflow exception
            this.Controls["b" + i + "n" + j].Enabled = false;
    }

危险方法就是这样

public int danger(int i, int j)
    {
        //Check if button is mine
        if (first.mines[i][j] == true)
            //9 is mine
            return 9;
        else
        {
            //d measures danger
            int d = 0;
            if (i != 0 && j != 0)
            {
                if (first.mines[i - 1][j - 1] == true) //top-left
                    d++;
            }
            if (j != 0)
            {
                if (first.mines[i][j - 1] == true) //top
                    d++;
            }
            if (i != 7 && j != 0)
            {
                if (first.mines[i + 1][j - 1] == true) //top-right
                    d++;
            }
            if (i != 0)
            {
                if (first.mines[i - 1][j] == true) //left
                    d++;
            }
            if (i != 7)
            {
                if (first.mines[i + 1][j] == true) //right
                    d++;
            }
            if (i != 0 && j != 7)
            {
                if (first.mines[i - 1][j + 1] == true) //bottom-left
                    d++;
            }
            if (j != 7)
            {
                if (first.mines[i][j + 1] == true) //bottom
                    d++;
            }
            if (i != 7 && j != 7)
            {
                if (first.mines[i + 1][j + 1] == true) //bottom-right
                    d++;
            }
            return d;

        }
    }

此方法首次调用expand方法

    public void check(int i, int j)
    {
        int dan = danger(i, j);
        if (dan == 9)
            mine();
        else if (dan > 0 && dan < 9)
            button_show(i, j, dan.ToString());
        else if (dan == 0)
            expand(i, j);
    }

Visual Studio展示了关于异常的文本,没有更多细节可用

An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

1 个答案:

答案 0 :(得分:1)

您正在使用递归,递归需要一个结束条件来停止递归。如果不是,您将触发stackoverflow异常。检查您的结束条件是否在您测试的情况下有效。您可以在非递归函数中处理所有隐居函数,但我猜您只是错过了结束/退出条件。

您必须考虑您已经知道的地方。此刻你正在一遍又一遍地重新检查它们。