首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字典中iOS ArgumentOutOfRangeException的统一博弈

字典中iOS ArgumentOutOfRangeException的统一博弈
EN

Stack Overflow用户
提问于 2015-05-14 18:28:06
回答 1查看 366关注 0票数 0

我有一个成就模块,用于保存和加载一个字典,其中包含成就(键)的名称,以及它是否已经完成(bool值)。我正在使用GDE (游戏数据编辑器)插件(这个)

我的模块在统一编辑器中运行良好,保存和加载所有内容。但在iOS中,它使用超出范围异常的参数崩溃。我的保存和加载方法:

代码语言:javascript
复制
    public void Load(){

    GDEAchievementsData achievements;

    if (!GDEDataManager.DataDictionary.TryGetCustom(GDEItemKeys.Achievements_Achievements, out achievements)){
        Debug.LogError("Error reading save data!");
    }

    LoadAchievementsInDictionary(achievements);

    Debug.Log("Achievement loaded data");
}

public void Save(){

    GDEAchievementsData achievements;

    if (!GDEDataManager.DataDictionary.TryGetCustom(GDEItemKeys.Achievements_Achievements, out achievements)){
        Debug.LogError("Error reading save data!");
    }

    SaveDictionaryInAchievements(AchievementScript.achievements, achievements);

    achievements.Set_Achievements();

    Debug.Log("ACHIEVEMENTS saved data");

}

void LoadAchievementsInDictionary(GDEAchievementsData gdeData){

    Debug.Log("Achievements: "+gdeData.Achievements);

    if(achievements==null){
        achievements = new AchievementList();
    }

    foreach(List<String> achievement in gdeData.Achievements){
        if(achievements.list.ContainsKey(achievement[0]))
        {
            achievements.list[achievement[0]] = (achievement[1]=="true")||(achievement[1]=="True");
        }else{
            achievements.list.Add(achievement[0], achievement[1]=="true"||achievement[1]=="True");
        }
    }

}

void SaveDictionaryInAchievements(AchievementList list, GDEAchievementsData gdeData){
    for(int i = 0; i < gdeData.Achievements.Count; i++){
        List<string> item = gdeData.Achievements[i];
        string achievementName = item[0];
        item[1] = list.list[achievementName].ToString();
    }

}

以及在XCode调试器中生成的用于保存的错误:

ArgumentOutOfRangeException:参数超出了范围。参数名称:索引at System.Collections.Generic.List`1System.String.get_Item (Int32索引) 0x00000 in :0 at AchievementScript.SaveDictionaryInAchievements (.AchievementList list,GameDataEditor.GDEAchievementsData gdeData) 0x00000 in :0 at AchievementScript.Save () 0x00000 in :0 at AchievementScript.OnApplicationFocus (Boolean ) 0x00000 in :0 at AchievementScript.OnApplicationPause (Boolean ) 0x00000 in :0

以及装货:

ArgumentOutOfRangeException:参数超出了范围。参数名称:索引at System.Collections.Generic.List`1System.String.get_Item (Int32索引) 0x00000 in :0 at AchievementScript.LoadAchievementsInDictionary (GameDataEditor.GDEAchievementsData gdeData) 0x00000 in :0 at AchievementScript.Load () 0x00000 in :0 at AchievementScript.OnApplicationFocus (Boolean ) 0x00000 in :0

为GDE团队问同样的问题,但是如果有人知道为什么会发生这种情况,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-14 19:37:05

多次访问achievement[0]achievement[1],而不首先检查achievement的大小--这可能导致索引异常,因为achievement中没有足够的元素。请注意,即使访问[0],如果List<>是空的,也会导致此错误。

要解决这个问题,请确保检查列表大小。这可以通过Linq来完成。

代码语言:javascript
复制
foreach(List<String> achievement in gdeData.Achievements.Where(l => l.Count >= 2)

或通过if语句

代码语言:javascript
复制
foreach(List<String> achievement in gdeData.Achievements)
{
    if(achievment < 2) continue;
    // Put the rest of your foreach logic here.
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30244656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档