{"record":{"id":"9938fce0e30d0b89","repo":"EllanJiang/GameFramework","slug":"name-of-data-node-is-invalid","errorCode":null,"errorMessage":"Name of data node is invalid.","messagePattern":"Name of data node is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/DataNode/DataNodeManager.DataNode.cs","lineNumber":44,"sourceCode":"            public DataNode()\n            {\n                m_Name = null;\n                m_Data = null;\n                m_Parent = null;\n                m_Childs = null;\n            }\n\n            /// <summary>\n            /// 创建数据结点。\n            /// </summary>\n            /// <param name=\"name\">数据结点名称。</param>\n            /// <param name=\"parent\">父数据结点。</param>\n            /// <returns>创建的数据结点。</returns>\n            public static DataNode Create(string name, DataNode parent)\n            {\n                if (!IsValidName(name))\n                {\n                    throw new GameFrameworkException(\"Name of data node is invalid.\");\n                }\n\n                DataNode node = ReferencePool.Acquire<DataNode>();\n                node.m_Name = name;\n                node.m_Parent = parent;\n                return node;\n            }\n\n            /// <summary>\n            /// 获取数据结点的名称。\n            /// </summary>\n            public string Name\n            {\n                get\n                {\n                    return m_Name;\n                }\n            }","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/DataNode/DataNodeManager.DataNode.cs#L26-L62","documentation":"DataNode.Create throws 'Name of data node is invalid.' when the given node name fails IsValidName (null, empty, or containing illegal path characters like the path separator). Static Create is used by GetOrAddChild, so an invalid segment anywhere in a hierarchical path surfaces here. The library validates names to keep path parsing (split by '/') unambiguous.","triggerScenarios":"Calling DataNode.Create(\"\", parent) or Create(null, parent); GetOrAddChild receiving a name with the separator character or whitespace-only content; building a path with a stray leading/trailing/duplicate separator producing an empty segment.","commonSituations":"Path strings assembled from variables where one segment is empty (e.g. string.Join with a null element); using a config/variable name containing '/'; typos producing empty segments like 'a//b'.","solutions":["Validate the name with DataNode.IsValidName(name) before calling Create","Check every path segment when paths are built from multiple variables","Ensure the node name is non-empty and contains no path separator characters"],"exampleFix":"// before\nIDataNode node = DataNode.Create(name, parent);\n// after\nif (DataNode.IsValidName(name))\n{\n    IDataNode node = DataNode.Create(name, parent);\n}","handlingStrategy":"validation","validationCode":"if (!DataNode.IsValidName(name))\n{\n    Log.Error($\"Invalid data node name: '{name}'\");\n    return null;\n}","typeGuard":"bool ValidSegment(string s) => !string.IsNullOrEmpty(s) && !s.Contains(\"/\");","tryCatchPattern":"try { node = DataNode.Create(name, parent); }\ncatch (GameFrameworkException) { Log.Error($\"Bad data node name '{name}'\"); node = null; }","preventionTips":["Validate each path segment before building nodes","Never embed '/' in node names; use hierarchy instead","Check for empty segments when joining paths from variables","Sanitize external/input-driven names"],"tags":["datanode","gameframework","invalid-name"],"backgroundTag":"invalid-argument-value","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"}