You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VB.NET测验程序中System.StackOverflowException异常排查求助

解决VB.NET测验程序的System.StackOverflowException异常

首先咱们得明确:System.StackOverflowException几乎都是无限递归调用或者无限循环触发事件导致的,和你怀疑的totalAdd这类变量定义关系不大——除非这些变量初始化时触发了隐性的递归逻辑,但你的代码里看不出这种情况。结合你的代码,我帮你梳理几个最可能的原因和修复方案:

1. 排查窗体循环创建的坑

你点击menuButton时会创建新的MenuForm并隐藏当前的QuizForm

Private Sub menuButton_Click(sender As Object, e As EventArgs) Handles menuButton.Click
    Dim quiz_menu As New MenuForm
    quiz_menu.Show()
    Me.Hide()
End Sub

如果你的MenuForm里也有类似逻辑,点击按钮又创建新的QuizForm,反复点击会生成大量窗体实例。更要命的是,如果某个窗体的Load事件里自动创建另一个窗体(比如MenuForm_Load里直接new一个QuizForm并Show),就会形成无限递归创建窗体,直接触发栈溢出。

修复方案

  • 切换窗体时用Me.Close()代替Me.Hide(),释放当前窗体的资源,避免实例堆积:
    Private Sub menuButton_Click(sender As Object, e As EventArgs) Handles menuButton.Click
        Dim quiz_menu As New MenuForm
        quiz_menu.Show()
        Me.Close()
    End Sub
    
  • 检查MenuForm的代码,确保没有在Load事件中自动实例化QuizForm的逻辑。

2. 合并重复的Random实例(优化隐性问题)

你的代码里创建了两个Random实例:

Dim Rnd1 As New Random
Dim Rnd2 As New Random

如果这两个实例创建的时间间隔极短,它们会生成完全相同的随机数序列,让题目失去随机性。虽然这不会直接导致栈溢出,但多余的实例可能引发其他隐性问题。

修复方案
只保留一个类级别的Random实例:

Dim rnd As New Random
Dim Num1 = rnd.Next(1, 10)
Dim Num2 = rnd.Next(1, 10)

后续所有生成随机数的地方都用这个rnd实例。

3. 添加题目数量限制,避免无限循环

你的代码里没有判断Questions是否达到10,用户可以一直点击按钮生成新题目,虽然这不会直接导致栈溢出,但长期运行可能引发其他内存问题,也不符合测验的逻辑。

修复方案
在每个分支的If confirm = DialogResult.OK后面加上And Questions < 10的判断,达到10题后停止生成新题目:

If confirm = DialogResult.OK And Questions < 10 Then
    ' 生成新题目的代码
End If

4. 精准定位异常的调试技巧

如果上面的方案都没解决问题,你可以用Visual Studio的调试工具精准定位:

  • 打开Exception Settings(Debug -> Windows -> Exception Settings),勾选Common Language Runtime Exceptions
  • 运行程序,当异常抛出时,查看Call Stack窗口,这里会显示递归调用的链条,一眼就能看到是哪段代码在无限循环调用。

内容的提问来源于stack exchange,提问作者Roberts William

火山引擎 最新活动