C# 静态List读文件赋值时报未初始化空引用错误如何解决
问题原因
你代码里的3个静态List字段仅完成了引用声明,没有进行实例化,引用类型的默认初始值为null,调用Add()方法时自然会触发空引用异常。
修复方案
- 方案1:声明字段时直接初始化
class Log { // 声明的同时完成实例化 static public List<string> varos = new List<string>(); static public List<int> tav = new List<int>(); static public List<int> n = new List<int>(); public void Input() { // 用using包裹StreamReader自动释放资源 using (var sr = new StreamReader("vartav.txt")) { while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] seged = s.Split(' '); // 增加格式校验,避免行格式错误触发索引越界 if (seged.Length >= 2) { Log.varos.Add(seged[0]); Log.tav.Add(Convert.ToInt32(seged[1])); } } } } }
- 方案2:在Input方法执行前初始化
如果你的逻辑需要延迟初始化,可以在读取数据前先判断实例是否存在:
public void Input() { // 空合并赋值语句,仅变量为null时执行实例化 Log.varos ??= new List<string>(); Log.tav ??= new List<int>(); Log.n ??= new List<int>(); using (var sr = new StreamReader("vartav.txt")) { while (!sr.EndOfStream) { string s = sr.ReadLine(); string[] seged = s.Split(' '); if (seged.Length >= 2) { Log.varos.Add(seged[0]); Log.tav.Add(Convert.ToInt32(seged[1])); } } } }
额外优化建议
- 用
using语句包裹StreamReader实例,代码执行完毕后会自动释放文件句柄,避免资源泄漏 - 增加行格式校验,避免文件中存在不符合格式的行时触发数组索引越界异常
- 可以额外添加
int.TryParse逻辑校验第二列是否为合法数字,避免转换报错
内容的提问来源于stack exchange,提问作者Szuperati12
相关产品推荐
相关产品推荐

