C# WinForms Hangman游戏显示下划线时触发ArgumentOutOfRangeException
解决Hangman游戏中的ArgumentOutOfRangeException异常
嘿,我一眼就发现你代码里的问题啦!先看看这段循环里的关键错误:
for (int i = 0; i < data.solution.Length; i++) { underline = new List<Label>(); // 这里每次循环都新建空列表! underline[i].Parent = this; // 空列表访问索引i肯定报错 // ... 其他代码 }
问题根源
你在循环内部每次都重新创建了一个空的List<Label>,这意味着每次循环时underline都是没有任何元素的空集合。当你尝试访问underline[i]的时候,自然会触发ArgumentOutOfRangeException——空列表里根本找不到索引为i的元素呀!
修复后的代码
把列表的初始化移到循环外面,然后在循环里创建新的Label实例并添加到列表中:
// 把列表初始化移到循环外面,只创建一次 List<Label> underline = new List<Label>(); int left = 300; int top = 275; for (int i = 0; i < data.solution.Length; i++) { // 新建一个Label实例,先把所有属性设置好 Label newUnderline = new Label(); newUnderline.Parent = this; newUnderline.Text = "_"; newUnderline.Size = new Size(35, 35); newUnderline.Location = new Point(left, top); left += 30; newUnderline.Font = new Font(new FontFamily("Microsoft Sans Serif"), 20, FontStyle.Bold); // 把配置好的Label添加到列表里 underline.Add(newUnderline); }
为什么这样能解决问题?
- 现在列表只在循环前初始化一次,不会每次循环都被清空重置。
- 每次循环我们先创建完整的Label实例、设置好所有属性,再添加到列表中,彻底避免了直接访问空列表索引的操作。
- 后续游戏逻辑(比如猜对字母时替换对应位置的下划线)也能通过
underline列表轻松访问到所有生成的标签。
内容的提问来源于stack exchange,提问作者lapartman
相关产品推荐
相关产品推荐

