{"record":{"id":"07b3861bf871f18b","repo":"babalae/better-genshin-impact","slug":"javascript","errorCode":null,"errorMessage":"javaScript不能为空","messagePattern":"javaScript不能为空","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs","lineNumber":377,"sourceCode":"\n            // 逐一点选查看面板筛选\n            await Salvage5Star();\n            logger.LogInformation(\"筛选完毕，请复查并手动分解\");\n        }\n        else\n        {\n            input.Keyboard.KeyPress(User32.VK.VK_ESCAPE);\n\n            if (returnToMainUi)\n            {\n                await new ReturnMainUiTask().Start(ct);\n            }\n        }\n    }\n\n    private async Task Salvage5Star()\n    {\n        string javaScript = this.javaScript ?? throw new ArgumentException($\"{nameof(this.javaScript)}不能为空\");\n        int count = this.maxNumToCheck ?? throw new ArgumentException($\"{nameof(this.maxNumToCheck)}不能为空\");\n        RecognitionFailurePolicy recognitionFailurePolicy = this.recognitionFailurePolicy ?? throw new ArgumentException($\"{nameof(this.recognitionFailurePolicy)}不能为空\");\n\n        GridParams gridParams = GridParams.Templates[GridScreenName.ArtifactSalvage];\n        GridScreen gridScreen = new GridScreen(gridParams, this.logger, this.ct); // 圣遗物分解Grid有4行9列\n        gridScreen.OnAfterTurnToNewPage += GridScreen.DrawItemsAfterTurnToNewPage;\n        gridScreen.OnBeforeScroll += () => VisionContext.Instance().DrawContent.ClearAll();\n        try\n        {\n            await foreach ((ImageRegion pageRegion, Rect itemRect) in gridScreen)\n            {\n                using ImageRegion itemRegion = pageRegion.DeriveCrop(itemRect);\n                Rect gridRect = itemRegion.ToRect();\n                if (GetArtifactStatus(itemRegion.SrcMat) == ArtifactStatus.None)\n                {\n                    itemRegion.Click();\n                    await Delay(300, ct);\n","sourceCodeStart":359,"sourceCodeEnd":395,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs#L359-L395","documentation":"Thrown at the top of Salvage5Star when this.javaScript is null. Salvage5Star is only meant to run when a custom JS filter is configured; the null-check with ArgumentException signals a contract violation by the caller. Start() guards the call with 'if (javaScript != null)' so reaching this throw means state was mutated or Start's logic was bypassed.","triggerScenarios":"Calling Salvage5Star directly with a param object whose JavaScript field is null/empty; Start's 'if (javaScript != null)' guard was removed or short-circuited; AutoArtifactSalvageTaskParam constructed without JavaScript but Salvage5Star invoked anyway.","commonSituations":"User configured only star-based quick-salvage (no JS filter) yet code path entered Salvage5Star; param deserialization left JavaScript null; refactor broke the null guard in Start.","solutions":["Ensure AutoArtifactSalvageTaskParam.JavaScript is set when 5-star JS filtering is desired.","Keep Start's 'if (javaScript != null)' guard intact so Salvage5Star is unreachable without JS.","Validate the param in the constructor and throw a clearer configuration error there.","If JS-less salvage is intended, do not call Salvage5Star."],"exampleFix":"// before\n// caller built param with JavaScript = null, then Start reached Salvage5Star\n// after - guard in constructor\npublic AutoArtifactSalvageTask(AutoArtifactSalvageTaskParam param, ILogger? logger = null)\n{\n    ...\n    if (string.IsNullOrWhiteSpace(param.JavaScript))\n        throw new ArgumentException(\"5星分解需要配置 JavaScript 过滤脚本\", nameof(param));\n    this.javaScript = param.JavaScript;\n}","handlingStrategy":"validation","validationCode":"if (string.IsNullOrWhiteSpace(param.JavaScript))\n    throw new ArgumentException(\"5星 JS 过滤脚本未配置\", nameof(param.JavaScript));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate required params (JavaScript, MaxNumToCheck, RecognitionFailurePolicy) in the constructor.","Keep Start's 'if (javaScript != null)' guard around Salvage5Star.","Surface one configuration error to the user before the task runs."],"tags":["game-task","null-check","configuration","contract"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}