【发布时间】:2021-05-30 15:14:55
【问题描述】:
void OpenClean( int i, int j) {
bnt[i, j] = new Button();
if (!bnt[i,j].Enabled) return;
bnt[i, j].Enabled = false;
bnt[i,j].BackColor = Color.Aquamarine;
bnt[i, j].Text = data[i, j].ToString();
if (data[i, j] == 0) {
if (i > 0 && j > 0 && data[i - 1, j - 1] == 0) OpenClean(i - 1, j - 1);
if (i > 0 && data[i - 1, j] == 0) OpenClean(i - 1, j);
if (i > 0 && j < 8 && data[i - 1, j + 1] == 0) OpenClean(i - 1, j + 1);
if (j > 0 && data[i, j - 1] == 0) OpenClean(i, j - 1);
if (j < 8 && data[i, j + 1] == 0) OpenClean(i, j + 1);
if (i < 8 && j > 0 && data[i + 1, j - 1] == 0) OpenClean(i + 1, j - 1);
if (i < 8 && data[i + 1, j] == 0) OpenClean(i + 1, j);
if (i < 8 && j < 8 && data[i + 1, j + 1] == 0) OpenClean(i + 1, j + 1);
}
它告诉我进程因 StackOverflowException 而终止。 由于我的经验有限,我没有找到有效的方法。 这个问题困扰了我很久。 请帮助或尝试给我一些解决方法的想法。
提前致谢!
【问题讨论】:
-
您正在反复调用您的
OpenClean方法。我没有检查您的所有条件,(而且我无法检查,因为我不知道data数组的内容)但您的条件可能有错误,因此您的递归调用永远不会停止。一段时间后会导致 StackOverflow 异常 -
这是学习如何使用调试器的好时机。在方法上设置断点。当程序停止时,查看调用堆栈,记下参数是什么。一步,一步,一步。继续前进,直到您再次调用该方法(然后您将再次遇到断点)。发生的事情应该很明显
标签: c#