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

C#新手求助:如何修复「Possible null reference return」错误?

解决C#「Possible null reference return」错误的方案

首先明确警告原因:代码里JsonConvert.DeserializeObject<Adventure>存在返回null的可能(比如JSON格式错误、内容为空时),但方法声明返回的是非可空的Adventure类型,C#的空引用检查机制判定这里有返回null的风险,因此抛出警告。

以下是几个实用修复方案,可根据你的业务场景选择:

方案1:保证返回实例永远非空

你已经初始化了initialAdventure = new Adventure(),可以在反序列化后做兜底判断,若反序列化返回null则保留初始空实例:

public Adventure GetInitialAdventure() 
{
    var basePath = $"{AppDomain.CurrentDomain.BaseDirectory}Adventures";
    var initialAdventure = new Adventure();

    if (File.Exists($"{basePath}\\initial.json"))
    {
        var directory = new DirectoryInfo(basePath);
        var initialJsonFile = directory.GetFiles("initial.json");
        
        // 新增判断避免索引越界(防止文件存在但读取时被删除的竞争场景)
        if (initialJsonFile.Length > 0)
        {
            using (StreamReader fi = File.OpenText(initialJsonFile[0].FullName))
            {
                var deserialized = JsonConvert.DeserializeObject<Adventure>(fi.ReadToEnd());
                // 反序列化结果为null时,用初始实例兜底
                initialAdventure = deserialized ?? initialAdventure;
            }
        }
    }

    return initialAdventure;
}

方案2:允许方法返回null(修改返回类型)

如果业务逻辑允许文件不存在/反序列化失败时返回null,可将方法返回类型改为可空的Adventure?:

public Adventure? GetInitialAdventure() 
{
    var basePath = $"{AppDomain.CurrentDomain.BaseDirectory}Adventures";
    Adventure? initialAdventure = null;

    if (File.Exists($"{basePath}\\initial.json"))
    {
        var directory = new DirectoryInfo(basePath);
        var initialJsonFile = directory.GetFiles("initial.json");
        
        if (initialJsonFile.Length > 0)
        {
            using (StreamReader fi = File.OpenText(initialJsonFile[0].FullName))
            {
                initialAdventure = JsonConvert.DeserializeObject<Adventure>(fi.ReadToEnd());
            }
        }
    }

    return initialAdventure;
}

注意:修改后调用该方法的地方必须处理null情况(比如用if (result != null)判断),否则会触发新的空引用警告。

方案3:强制消除警告(不推荐新手使用)

若你能100%保证initial.json内容绝对正确、反序列化永远不会返回null,可使用null-forgiving运算符!告知编译器“此处不会为null”:

return initialAdventure!;

这种方式是绕过编译器检查,若后续JSON文件出现问题,运行时会直接抛出空引用异常,风险较高,不建议新手采用。

要不要忽略该错误?

绝对不建议忽略!这个警告是C#帮你提前规避空引用异常的机制,新手修复它能养成更严谨的编码习惯,避免后续出现莫名其妙的运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:25:28