VB.NET添加电影项触发索引超出范围错误的问题排查
问题原因与解决方案
错误原因
你定义数组时,i初始值是0,所以Flm(i) As Film创建的是长度为1的数组(仅能访问索引0的元素)。第一次点击按钮时,i=0,赋值后i变为1;第二次点击时,代码尝试访问Flm(1),但数组没有这个索引,直接触发“索引超出矩阵限制”的错误——普通数组的长度是固定的,无法动态扩容。
修复方案
既然电影数量不固定,推荐使用**List(Of Film)动态集合**代替数组,它可以自动扩容,完美适配需求。
修改模块代码
Module Module1 Public Structure Film Public Titolo As String Public Autore As String Public Incasso As Integer Public Nazionalita As String End Structure ' 用动态List替代固定长度数组 Public filmList As New List(Of Film)() End Module
修改输入按钮代码
Public Class frmInput Private Sub btnInserisci_Click(sender As Object, e As EventArgs) Handles btnInserisci.Click Dim incasso As Integer ' 用更严谨的TryParse判断数值,替代IsNumeric If Not Integer.TryParse(txtIncasso.Text, incasso) Then MsgBox("票房必须是数值类型", MsgBoxStyle.Exclamation, "注意") ElseIf String.IsNullOrEmpty(txtTitolo.Text) Or String.IsNullOrEmpty(txtAutore.Text) Or String.IsNullOrEmpty(txtNazionalita.Text) Then MsgBox("存在空值,请填写完整", MsgBoxStyle.Exclamation, "注意") Else ' 创建新的电影实例并添加到列表 Dim newFilm As Film newFilm.Titolo = txtTitolo.Text newFilm.Autore = txtAutore.Text newFilm.Incasso = incasso newFilm.Nazionalita = txtNazionalita.Text filmList.Add(newFilm) ' 可选:清空输入框,方便后续输入 txtTitolo.Clear() txtAutore.Clear() txtIncasso.Clear() txtNazionalita.Clear() End If End Sub End Class
额外说明
List(Of T)是VB.NET中专门处理动态元素数量的集合,调用Add方法即可自动扩容,无需手动管理数组长度。- 原代码用
IsNumeric判断数值不够严谨,Integer.TryParse会直接尝试转换并返回结果,避免非整数数值(比如小数)被误判的情况。
内容的提问来源于stack exchange,提问作者u0lf
相关产品推荐
相关产品推荐

