You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过存储合法输入的接口验证C#方法用户输入?遇空引用异常

解决验证用户输入时的System.NullReferenceException问题

你遇到的System.NullReferenceException直接原因是代码里INumbUnit? x = null;,之后在while(UserSourceUnit != x.UnitName)中尝试访问x.UnitName——null对象没有任何成员,所以必然触发空引用异常。

结合你提到的合法UnitName存储在外部类的情况,正确的验证逻辑应该是检查用户输入是否存在于合法单位集合中,而不是用一个null的接口实例。以下是修复后的代码示例:

public interface INumbUnit
{
    string UnitName { get; set; }
}

// 假设外部类中存储合法单位的属性是这个(根据你的实际情况调整名称)
// public class ExternalUnitStore
// {
//     public static List<INumbUnit> ValidUnits { get; } = new List<INumbUnit>();
// }

public void ValidateNumb()
{
    // 先处理空输入的情况
    while (string.IsNullOrEmpty(UserSourceUnit))
    {
        Console.WriteLine("[ERROR] Input can't be empty! Please try again.");
        ChooseUnits(); // 假设这个方法会重新获取UserSourceUnit的值
    }

    // 循环验证输入是否在合法单位中
    while (!IsValidUnit(UserSourceUnit))
    {
        Console.WriteLine("[ERROR] No such unit for selection! Please try again.");
        ChooseUnits(); // 必须重新获取输入,否则会无限循环
    }
}

// 新增辅助方法,检查输入是否合法
private bool IsValidUnit(string inputUnit)
{
    // 从外部类获取合法单位集合,遍历检查UnitName是否匹配
    return ExternalUnitStore.ValidUnits.Any(unit => unit.UnitName.Equals(inputUnit, StringComparison.OrdinalIgnoreCase));
    // 如果需要区分大小写,去掉StringComparison.OrdinalIgnoreCase参数
}

关键改动说明:

  • 移除了null的INumbUnit实例x,改用合法单位集合进行校验
  • 新增IsValidUnit方法封装校验逻辑,代码更清晰
  • 在第二个while循环内补充了ChooseUnits()调用,避免输入错误后无限循环
  • 使用Any()方法简化集合遍历判断,同时加入大小写忽略的选项(可根据需求调整)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:02:05