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

为何从JSON加载值后Integer类型的ExeBalance未更新?

问题排查与解决方案

你遇到的核心问题是DataHandler的ExeBalance字段在赋值后未保留预期值,虽然断点显示JSON中的JBalance已被正确读取,以下是最可能的原因和解决步骤:

1. 实例不匹配(最常见)

你调试时查看的DataHandler对象和实际业务中使用的不是同一个实例。每个DataHandler实例都有独立的ExeBalance字段,比如:

// 调用LoadSave的实例
var handlerA = new DataHandler();
handlerA.LoadSave(); // 这里ExeBalance被设为5

// 但你后续访问的是另一个实例
var handlerB = new DataHandler();
Console.WriteLine(handlerB.ExeBalance); // 输出0,因为这是全新的实例

验证方式:
在LoadSave方法里添加实例哈希值输出:

public void LoadSave()
{
    // ... 原有代码
    ExeBalance = saveDataJson.JBalance;
    Console.WriteLine($"当前DataHandler实例哈希: {this.GetHashCode()}");
    Console.WriteLine($"ExeBalance加载后的值: {ExeBalance}");
}

在你访问ExeBalance的地方也打印对应实例的哈希值,如果两者不同,说明是实例不匹配,需要确保全程使用同一个DataHandler对象。

2. 赋值后被其他代码覆盖

检查ExeBalance = saveDataJson.JBalance;执行之后,有没有其他代码修改了ExeBalance的值。比如:

  • 调用了AddBalance方法(注意你的AddBalance方法里写的是ExeBalance = ExeBalance + 1;,不管传入的amt是什么都会加1)
  • 其他重置ExeBalance的逻辑

验证方式:
在ExeBalance字段上设置写入断点(Visual Studio中右键字段→选择"新建断点→写入时中断"),这样每次ExeBalance被修改时都会触发断点,就能看到是哪行代码覆盖了值。

3. 代码优化建议

为了避免潜在的资源泄漏和空值问题,建议修改LoadSave方法的写法:

public void LoadSave()
{
    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "savedata.json");
    // 使用using自动释放StreamReader资源
    using (StreamReader sr = new StreamReader(filePath))
    {
        string saveDataContent = sr.ReadToEnd();
        var saveDataJson = JsonConvert.DeserializeObject<DataObject>(saveDataContent);
        
        // 增加空值检查,避免NullReferenceException
        if (saveDataJson != null)
        {
            ExeBalance = saveDataJson.JBalance;
            Console.WriteLine($"ExeBalance从savedata.json加载后的值: {ExeBalance}");
        }
        else
        {
            Console.WriteLine("JSON反序列化失败,saveDataJson为null");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:30:41