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

.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",并非空值(有截图佐证)。


排查方向和解决步骤

  1. 确认_config实例有效性
    虽然能读取到字符串,但仍需排除_config未正确初始化的可能,在代码开头添加判空校验:

    if (_config == null)
    {
        throw new InvalidOperationException("配置实例未初始化");
    }
    
  2. 移除冗余编码转换步骤
    当前的编码转换完全多余,反而可能引入隐藏问题,直接简化代码:

    if (_config.GetValue<string>("DaysToDelete") is string daysStr && int.TryParse(daysStr, out int result))
    {
        // 正常使用result
    }
    else
    {
        // 处理转换失败或配置缺失的情况
    }
    
  3. 改用强类型配置绑定
    推荐使用框架自带的强类型绑定,避免手动转换的风险:

    • 创建配置类:
      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;
      

    这种方式会由框架自动处理类型转换,还能在启动阶段提前校验配置合法性。

  4. 检查配置加载优先级
    确认是否存在环境特定配置文件(如appsettings.Development.json)覆盖了DaysToDelete的值,导致实际读取为null。可以打印完整配置验证:

    foreach (var item in _config.AsEnumerable())
    {
        Console.WriteLine($"{item.Key}: {item.Value}");
    }
    
  5. 清理字符串中的不可见字符
    若字符串包含空格、换行等不可见字符,也可能导致转换异常,先做清理:

    string cleanStr = daysToDeleteString?.Trim() ?? string.Empty;
    if (int.TryParse(cleanStr, out int result))
    {
        // 处理逻辑
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:03:25