{"record":{"id":"f6326e73d8a0efb8","repo":"EllanJiang/GameFramework","slug":"data-name-is-invalid","errorCode":null,"errorMessage":"Data name is invalid.","messagePattern":"Data name is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Fsm/Fsm.cs","lineNumber":421,"sourceCode":"            }\n\n            results.Clear();\n            foreach (KeyValuePair<Type, FsmState<T>> state in m_States)\n            {\n                results.Add(state.Value);\n            }\n        }\n\n        /// <summary>\n        /// 是否存在有限状态机数据。\n        /// </summary>\n        /// <param name=\"name\">有限状态机数据名称。</param>\n        /// <returns>有限状态机数据是否存在。</returns>\n        public bool HasData(string name)\n        {\n            if (string.IsNullOrEmpty(name))\n            {\n                throw new GameFrameworkException(\"Data name is invalid.\");\n            }\n\n            if (m_Datas == null)\n            {\n                return false;\n            }\n\n            return m_Datas.ContainsKey(name);\n        }\n\n        /// <summary>\n        /// 获取有限状态机数据。\n        /// </summary>\n        /// <typeparam name=\"TData\">要获取的有限状态机数据的类型。</typeparam>\n        /// <param name=\"name\">有限状态机数据名称。</param>\n        /// <returns>要获取的有限状态机数据。</returns>\n        public TData GetData<TData>(string name) where TData : Variable\n        {","sourceCodeStart":403,"sourceCodeEnd":439,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Fsm/Fsm.cs#L403-L439","documentation":"Fsm.HasData validates the data name before consulting the internal m_Datas dictionary. If the name is null or empty the library cannot identify any stored variable, so it throws GameFrameworkException('Data name is invalid.') immediately instead of performing a lookup. This is an argument-validation guard, not a state error.","triggerScenarios":"Calling fsm.HasData(null) or fsm.HasData(\"\") or fsm.HasData(variableName) where variableName is an uninitialized or whitespace-trimmed-to-empty string field.","commonSituations":"Passing a name read from config/JSON that failed to deserialize; forwarding a caller-supplied string without checking; a refactor that renamed a data key and left an empty variable behind.","solutions":["Ensure the name passed to HasData is a non-null, non-empty string before calling","If the name comes from external input/config, validate or trim it and reject empties early","Check the calling code for variables that were never assigned (default null string)","Wrap the call in try-catch only as a last resort; prefer pre-validation"],"exampleFix":"// before\nbool has = fsm.HasData(name);\n// after\nif (!string.IsNullOrEmpty(name))\n{\n    bool has = fsm.HasData(name);\n}","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(name)) throw new ArgumentException(\"Data name must be non-empty\", nameof(name));","typeGuard":"bool IsValidDataName(string name) => !string.IsNullOrEmpty(name);","tryCatchPattern":"try { fsm.HasData(name); } catch (GameFrameworkException ex) when (ex.Message == \"Data name is invalid.\") { /* handle invalid name */ }","preventionTips":["Always validate names from external sources (config, network, user input) before FSM data APIs","Initialize string key constants with real values, never string.Empty","Trim and reject whitespace-only names at your boundary layer"],"tags":["fsm","argument-validation","empty-string"],"backgroundTag":"empty-required-field","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}