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

C#列表索引越界异常处理:如何避免不存在位置的未处理错误?

解决会员序号超出范围的异常问题

首先,你的代码当前存在两个潜在异常点:输入非整数时的格式错误,以及序号超出会员数量时的索引越界。可以通过输入验证和边界检查直接解决,同时更建议优化数据存储结构,从根源减少出错可能:

1. 先处理输入异常的直接方案

先验证用户输入是否为有效整数,再检查序号是否在合法范围内:

Console.WriteLine("Which stored membership would you like to view? (e.g 1, 2..)");
// 验证输入是否为合法整数
if (!int.TryParse(Console.ReadLine(), out int membChoice))
{
    Console.WriteLine("请输入有效的数字序号!");
    return; // 或执行重新输入的逻辑
}

// 计算当前存储的会员总数(每个会员占3个列表元素)
int totalMembers = membersList.Count / 3;
// 检查序号是否在1到会员总数的范围内
if (membChoice < 1 || membChoice > totalMembers)
{
    Console.WriteLine($"无效的序号!当前共有{totalMembers}个会员,请输入1-{totalMembers}之间的数字");
    return;
}

// 验证通过后再输出会员信息
Console.WriteLine("Membership Entry " + membChoice);
Console.WriteLine("Username: " + membersList[membChoice*3-3]);
Console.WriteLine("Password: " + membersList[membChoice*3-2]);
Console.WriteLine("Membership Type: " + membersList[membChoice*3-1].ToUpper());

2. 优化会员数据存储结构(更关键的改进)

你现在用单个列表存放所有会员的三个字段,不仅容易出现索引计算错误,还会导致维护困难。作为初学者,建议用类封装会员信息,逻辑会更清晰:

// 定义会员类,封装单个会员的所有信息
public class Member
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string MembershipType { get; set; }
}

// 替换原来的列表为Member类型的列表
List<Member> membersList = new List<Member>();

录入会员时直接添加对象:

// 示例:新增一个会员
var newMember = new Member
{
    Username = "testUser",
    Password = "123456",
    MembershipType = "gold"
};
membersList.Add(newMember);

查看会员的代码会更简洁,也不会有索引计算错误:

Console.WriteLine("Which stored membership would you like to view? (e.g 1, 2..)");
if (!int.TryParse(Console.ReadLine(), out int membChoice))
{
    Console.WriteLine("请输入有效的数字序号!");
    return;
}

// 直接用列表Count获取会员总数,检查序号范围
if (membChoice < 1 || membChoice > membersList.Count)
{
    Console.WriteLine($"无效的序号!当前共有{membersList.Count}个会员,请输入1-{membersList.Count}之间的数字");
    return;
}

// 注意:列表是0索引,用户输入的是1开头的序号,需要减1
var selectedMember = membersList[membChoice - 1];
Console.WriteLine($"Membership Entry {membChoice}");
Console.WriteLine($"Username: {selectedMember.Username}");
Console.WriteLine($"Password: {selectedMember.Password}");
Console.WriteLine($"Membership Type: {selectedMember.MembershipType.ToUpper()}");

3. 简单实现会员信息的文件读写(满足老师要求)

对于初学者,用JSON格式读写是最易上手的方式,需要引用System.Text.Json命名空间:

写入文件(保存会员数据)

// 将会员列表序列化为JSON字符串并写入文件
string json = JsonSerializer.Serialize(membersList);
File.WriteAllText("members.json", json);

读取文件(加载已存会员)

// 程序启动时加载文件中的会员数据
if (File.Exists("members.json"))
{
    string json = File.ReadAllText("members.json");
    membersList = JsonSerializer.Deserialize<List<Member>>(json) ?? new List<Member>();
}
else
{
    // 文件不存在则初始化空列表
    membersList = new List<Member>();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:05:18