如何在此代码中避免或处理堆栈溢出异常? (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
答案 0 :(得分:1)
您正在使用递归,递归需要一个结束条件来停止递归。如果不是,您将触发stackoverflow异常。检查您的结束条件是否在您测试的情况下有效。您可以在非递归函数中处理所有隐居函数,但我猜您只是错过了结束/退出条件。
您必须考虑您已经知道的地方。此刻你正在一遍又一遍地重新检查它们。