从一次意外的堆栈溢出异常说开来 (一)
2011-09-23 22:13
267 查看
今天有一个朋友告诉我他的程序发生了StackOverFlowException
可是查来查去不知道为什么,就一段递归代码几个人阅读过似乎都没有问题
以下是简化版的代码 (真实的代码复杂很多,不过大意如下)
呵呵,大家能看出有什么问题么? 提示:逻辑上没有任何问题,也别在找什么语法错误
看起来逻辑是:这段代码没有死循环,20000次就退出嘛,
可是在实际运行中会抛出StackOverFlowException异常,
其原因是由于递CLR中默认堆栈大小是1M,
此程序不断的递归,每一级递归的方法都被压入了堆栈,当堆栈大小达到1M的时候,StackOverFlowException就抛出了
在我的机器上i运行到15918的时候抛出了堆栈溢出
大家可能觉得 要递归10000多次呢,看起来应该不会有什么问题吧
其实只要不小心,小几百次的递归就会出异常。
稍后演示这种情况。。。
可是查来查去不知道为什么,就一段递归代码几个人阅读过似乎都没有问题
以下是简化版的代码 (真实的代码复杂很多,不过大意如下)
static void Test(int i) { if (i > 20000)//或者其他退出条件 { return; } Test(i + 1); } static void Main() { Test(0); }
呵呵,大家能看出有什么问题么? 提示:逻辑上没有任何问题,也别在找什么语法错误
看起来逻辑是:这段代码没有死循环,20000次就退出嘛,
可是在实际运行中会抛出StackOverFlowException异常,
其原因是由于递CLR中默认堆栈大小是1M,
此程序不断的递归,每一级递归的方法都被压入了堆栈,当堆栈大小达到1M的时候,StackOverFlowException就抛出了
在我的机器上i运行到15918的时候抛出了堆栈溢出
大家可能觉得 要递归10000多次呢,看起来应该不会有什么问题吧
其实只要不小心,小几百次的递归就会出异常。
稍后演示这种情况。。。
相关文章推荐
- 记一次TCP连接异常故障解决
- 一次意外的页面访问不了!
- C# 调用Excel 出现服务器出现意外情况. (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)
- 无法保存webpart的属性设置,发生意外,异常来自 HRESULT:0x80020009(DISP_E_EXCEPTION)
- 记一次异常org.apache.commons.lang.exception.NestableRuntimeException
- 从一次 Snowflake 异常说起
- 在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
- 记一次通过监听连接数据库显示SYSDATE异常解决方案
- 通达OA 一次系统异常问题处理
- 一次delete速度异常慢的处理过程
- 一次意外的惊喜
- 记一次数据库连接池阻塞导致的服务异常
- 第一次调微信支付正常弹出支付页面并成功支付了,再次调用时就支付异常,换个微信账号又能调用一次
- 记一次故障处理----主机异常关闭后mongodb二进制文件损坏
- Yosimite 系统 “发生意外错误(错误代码-50)” (记一次macbook pro(mid2012) 自主维修排错经历)
- 从一次 Snowflake 异常说起
- 一次监听异常的检测
- 记录一次RAC异常的问题和处理
- PHP中intval()等int转换时的意外异常情况解析
- 一次排除异常的经历