如何通过存储合法输入的接口验证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
相关产品推荐
相关产品推荐

