.NET Core 8读取appsettings字符串转Int触发NullReferenceException
.NET Core 8读取appsettings字符串转int触发NullReferenceException(非空字符串场景)
注:此问题曾被标记为空引用异常相关问题的重复项,但并非重复。通用问题仅为空引用异常的基础说明,而此问题聚焦于从appsettings配置文件读取的非空字符串无法转换为整数的场景。
在.NET Core 8.0环境中,从appsettings.json读取字符串值后,尝试转换为int时触发NullReferenceException。已尝试Int32.Parse、Int32.TryParse、Convert.ToInt32方法,还尝试将值转换为UTF8编码,但均返回相同错误。
配置文件片段
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "Console": { "LogLevel": { "Default": "Warning" } }, "DaysToDelete": "30", "BasePath": "D:\\WebServices\\SalesForceFiles\\" }
相关代码
var basePath = _config.GetSection("BasePath").Value; var dirInfo = new DirectoryInfo(basePath); //尝试Steve Wong的建议,仍报错 string? daysToDeleteString = _config.GetValue<string>("DaysToDelete"); byte[] bytes = Encoding.Default.GetBytes(daysToDeleteString); string deleteDays = Encoding.UTF8.GetString(bytes); //此行触发错误:对象引用未设置到对象的实例 var del = Int32.TryParse(deleteDays, out int result);
关键现象:变量deleteDays的值为"30",并非空值(有截图佐证)。
排查方向和解决步骤
确认
_config实例有效性
虽然能读取到字符串,但仍需排除_config未正确初始化的可能,在代码开头添加判空校验:if (_config == null) { throw new InvalidOperationException("配置实例未初始化"); }移除冗余编码转换步骤
当前的编码转换完全多余,反而可能引入隐藏问题,直接简化代码:if (_config.GetValue<string>("DaysToDelete") is string daysStr && int.TryParse(daysStr, out int result)) { // 正常使用result } else { // 处理转换失败或配置缺失的情况 }改用强类型配置绑定
推荐使用框架自带的强类型绑定,避免手动转换的风险:- 创建配置类:
public class AppSettings { public int DaysToDelete { get; set; } public string BasePath { get; set; } = string.Empty; } - 在Program.cs中注册配置:
builder.Services.Configure<AppSettings>(builder.Configuration); - 注入并使用:
private readonly AppSettings _appSettings; public YourService(IOptions<AppSettings> appSettings) { _appSettings = appSettings.Value; } // 直接使用强类型值 int days = _appSettings.DaysToDelete;
这种方式会由框架自动处理类型转换,还能在启动阶段提前校验配置合法性。
- 创建配置类:
检查配置加载优先级
确认是否存在环境特定配置文件(如appsettings.Development.json)覆盖了DaysToDelete的值,导致实际读取为null。可以打印完整配置验证:foreach (var item in _config.AsEnumerable()) { Console.WriteLine($"{item.Key}: {item.Value}"); }清理字符串中的不可见字符
若字符串包含空格、换行等不可见字符,也可能导致转换异常,先做清理:string cleanStr = daysToDeleteString?.Trim() ?? string.Empty; if (int.TryParse(cleanStr, out int result)) { // 处理逻辑 }
内容的提问来源于stack exchange,提问作者WorkJ
相关产品推荐
相关产品推荐

