{"record":{"id":"77d921c22e27a0bd","repo":"EllanJiang/GameFramework","slug":"you-must-set-data-helper-first","errorCode":null,"errorMessage":"You must set data helper first.","messagePattern":"You must set data helper first\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"critical","filePath":"GameFramework/Base/DataProvider/DataProvider.cs","lineNumber":268,"sourceCode":"        /// </summary>\n        /// <param name=\"dataString\">要解析的内容字符串。</param>\n        /// <returns>是否解析内容成功。</returns>\n        public bool ParseData(string dataString)\n        {\n            return ParseData(dataString, null);\n        }\n\n        /// <summary>\n        /// 解析内容。\n        /// </summary>\n        /// <param name=\"dataString\">要解析的内容字符串。</param>\n        /// <param name=\"userData\">用户自定义数据。</param>\n        /// <returns>是否解析内容成功。</returns>\n        public bool ParseData(string dataString, object userData)\n        {\n            if (m_DataProviderHelper == null)\n            {\n                throw new GameFrameworkException(\"You must set data helper first.\");\n            }\n\n            if (dataString == null)\n            {\n                throw new GameFrameworkException(\"Data string is invalid.\");\n            }\n\n            try\n            {\n                return m_DataProviderHelper.ParseData(m_Owner, dataString, userData);\n            }\n            catch (Exception exception)\n            {\n                if (exception is GameFrameworkException)\n                {\n                    throw;\n                }\n","sourceCodeStart":250,"sourceCodeEnd":286,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Base/DataProvider/DataProvider.cs#L250-L286","documentation":"ParseData(string, object) — the string-based parse entry — needs an IDataProviderHelper to perform the actual parsing. If SetDataProviderHelper was never called (m_DataProviderHelper == null) it throws immediately. Initialization-order guard, thrown before the dataString is even inspected.","triggerScenarios":"Calling ParseData(dataString, userData) (or the ParseData(string) overload) on a DataProvider without a helper assigned via SetDataProviderHelper.","commonSituations":"Using the string-parse path in a provider configured only for asset loading; helper assignment skipped in custom initialization code; helper component missing in the Unity scene.","solutions":["Call SetDataProviderHelper(helper) before any ParseData call.","Reuse the same helper assignment used for ReadData on this provider instance.","In tests/tools, construct and register a concrete IDataProviderHelper implementation first."],"exampleFix":"// before\nbool ok = dataProvider.ParseData(json, null); // helper missing\n// after\ndataProvider.SetDataProviderHelper(helper);\nbool ok = dataProvider.ParseData(json, null);","handlingStrategy":"validation","validationCode":"if (m_DataProviderHelper == null) { /* call SetDataProviderHelper */ }\nbool ok = dataProvider.ParseData(text, userData);","typeGuard":"bool HasHelper(IDataProviderHelper h) => h != null;","tryCatchPattern":"try { dataProvider.ParseData(text, null); }\ncatch (GameFrameworkException e) when (e.Message.Contains(\"data helper\")) { Log.Error(\"Call SetDataProviderHelper before ParseData.\"); }","preventionTips":["Set the helper once during provider initialization, before any parse/load call.","Centralize provider setup in a single factory/init function."],"tags":["initialization","missing-dependency","parse"],"backgroundTag":"missing-dependency","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"}