【发布时间】:2014-07-20 01:20:30
【问题描述】:
如何避免或处理这段代码中的堆栈溢出异常?
(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
【问题讨论】:
-
请显示完整的异常堆栈
-
你的
danger方法是什么样的? -
您需要一个退出条件。在您当前的实现中,您从
button_show调用expand,无论dan==0与否,您立即调用button_show,再次调用expand,(无限重复)。您需要确保该循环被打破的地方 -
但是当危险不是0时,回路必须刹车
标签: c# exception stack overflow