You need to enable JavaScript to run this app. C# WinForm密码校验时输入数字触发IndexOutOfRangeException异常
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm密码校验时输入数字触发IndexOutOfRangeException异常

异常触发的根因

你的代码抛出IndexOutOfRangeException的核心原因有两个层面:

  • 规则逻辑前后自相矛盾:你预先设定的合法密码长度区间是3-8位,但代码中却直接访问字符串索引为8的字符。C# 中字符串采用0起始的索引规则,长度为8的字符串,最大合法索引是7,这个区间内的密码根本不存在第9位的字符,逻辑本身就无法成立。
  • 缺少索引访问前的长度校验,叠加逻辑与的短路特性:
    代码在访问password[0]、password[8]时,没有提前判断当前输入的字符串长度是否足够支撑对应索引访问。C# 的&&是短路求值逻辑,当char.IsUpper(password[0])返回false时,不会执行后面的char.IsLower(password[8]),自然不会触发异常;但只要密码首位确实是大写字母,代码就会继续执行到索引8的访问逻辑。
    你感知到“只要输入数字就抛异常”,是因为当你先输入大写字母作为密码首位,后续补入数字凑够3位以上长度时,满足了“纯字母数字、长度达标、包含数字”三个前置条件,同时首位大写的判断为true,就会执行到访问索引8的代码行。此时的密码最长也才8位,根本没有索引8对应的字符,直接触发越界。如果输入标点、符号这类非字母数字的内容,会在第一层校验分支就被拦截,根本走不到后面的索引访问逻辑,自然不会触发异常。
具体修复方案
  • 先对齐密码规则的一致性
    • 如果你的长度规则确实是3-8位,那需要删除“校验第9位是小写”的相关逻辑,不然规则本身就存在逻辑冲突。
    • 如果你的规则确实要求第9位为小写,需要把长度校验的上限从8位调整为至少9位,保证字符串存在可访问的第9位字符。
  • 所有字符串索引访问前,增加长度前置判断
    不要硬编码访问固定索引值,改成先判断长度再取值的安全写法,从根源上避免越界:
    // 安全的索引判断逻辑
    bool isFirstCharUpper = password.Length >= 1 && char.IsUpper(password[0]);
    // 要访问索引8,必须保证字符串长度至少为9(索引最大为长度-1)
    bool isNinthCharLower = password.Length >= 9 && char.IsLower(password[8]);
    if (isFirstCharUpper && isNinthCharLower)
    {
        // 走有效密码的分支逻辑
    }
    
  • 修正UI反馈的逻辑错位
    现有代码在判断“大写/小写不满足”的else分支里,错误地把代表“包含数字”规则的button2改成了打叉状态,但此时的输入已经满足包含数字的规则,这类状态错配需要对应调整到匹配的规则分支里。

内容的提问来源于stack exchange,提问作者Leviathan Co

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 02:06:03