递归造成的 “System.StackOverflowException”类型的异常

prestashop 2011-11-01 01:20:51


错误: 未处理的“System.StackOverflowException”类型的异常出现在 System.Windows.Forms.dll


private void bind_online_sys_tree(object obj)
{
try
{
string ChildNodes = ((loadTreeView)obj).NodeId;
TreeNode tn = ((loadTreeView)obj).Node;
string classString = ((loadTreeView)obj).ClassType;
loadTreeView aa;

DataRow[] dRow = dataTable_sysLnk.Select("SysLink_linkClass='" + classString+"'");

int i = 0;
foreach (DataRow dr in dRow)
{
TreeNode Node = new TreeNode();
if (tn == null)
{ //添加根节点
Node.Text = dr["text"].ToString()+"online";
this.BeginInvoke(new treeViewExpandDelegate(treeViewExpandNode), new object[] {treeView1, i });
bind_online_sys_tree(aa);
}
else
{
Node.Text = StrToFirstUpper(dr["text"].ToString());
this.BeginInvoke(new treeViewAddSubNodeDelegate(treeViewAddSubNode), new object[] { tn, Node });//这里出错
aa = new loadTreeView(dr["Id"].ToString(), Node, classString);
bind_online_sys_tree(aa);
}
i++;
Thread.Sleep(0);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void treeViewAddSubNode(TreeNode tn, TreeNode Node)
{
tn.Nodes.Add(Node);
}

...全文
487 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2011-11-01
  • 打赏
  • 举报
回复
如同死循环不能说明CPU速度不够快一样。
无限递归和内存容量没有关系。它是你程序的bug造成的。
sp1234说的情形(默认堆栈空间不够,需要调整)属于很特殊的情况,你不会遇到。

要想重现StackOverflowException异常,如下的程序就可以了:
static void Main()
{
foo();
}

static void foo()
{
foo();
}
threenewbee 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 prestashop 的回复:]
引用 1 楼 caozhy 的回复:

无限递归造成堆栈溢出。

aa = new loadTreeView(dr["Id"].ToString(), Node, classString);
bind_online_sys_tree(aa);

这里缺少判断,如果是最下层节点,就不要再调用bind_online_sys_tree了。


出现这个错误 System.StackO……
[/Quote]
出现这个错误 System.StackOverflowException 说明内存不足吗?
和内存不足没有关系
能不用递归就尽量不用递归 这说法正确吗?
不正确
  • 打赏
  • 举报
回复
修改你的编译器参数,是可以修改栈的大小的。不过一般来说,你的程序应该先去检测递归结束条件,调整逻辑流程而先去执行浅层的递归(因为其它调用拖后往往会尽早跳出),将递归程序转换为迭代程序(比如说把尾递归程序修改为一条“goto begin;”代码),这些都是首先要考虑的。一般来说不用去设置编译器参数。
  • 打赏
  • 举报
回复
不是内存不足,是分配的栈的空间用尽了。许多编程环境只为一个线程分配几百k的栈空间,貌似.net也就是1M而已。

说“能不用递归就尽量不用递归”这显然是另类的,只告诉你“不用”是很容易大嘴巴就喊出来的口号,但是这是毫无建设性的。
prestashop 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]

无限递归造成堆栈溢出。

aa = new loadTreeView(dr["Id"].ToString(), Node, classString);
bind_online_sys_tree(aa);

这里缺少判断,如果是最下层节点,就不要再调用bind_online_sys_tree了。
[/Quote]

出现这个错误 System.StackOverflowException 说明内存不足吗?

能不用递归就尽量不用递归 这说法正确吗?

threenewbee 2011-11-01
  • 打赏
  • 举报
回复
无限递归造成堆栈溢出。

aa = new loadTreeView(dr["Id"].ToString(), Node, classString);
bind_online_sys_tree(aa);

这里缺少判断,如果是最下层节点,就不要再调用bind_online_sys_tree了。
mabaolin 2011-11-01
  • 打赏
  • 举报
回复
出现这个问题基本就是死循环出现了。
if (tn == null)
{ //添加根节点
Node.Text = dr["text"].ToString()+"online";
this.BeginInvoke(new treeViewExpandDelegate(treeViewExpandNode), new object[] {treeView1, i });
bind_online_sys_tree(aa);//这行屏蔽掉
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧