{"record":{"id":"4bd04925a4ace81f","repo":"babalae/better-genshin-impact","slug":"maxnumtocheck","errorCode":null,"errorMessage":"maxNumToCheck不能为空","messagePattern":"maxNumToCheck不能为空","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs","lineNumber":378,"sourceCode":"            // 逐一点选查看面板筛选\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\n                    using var ra1 = CaptureToRectArea();","sourceCodeStart":360,"sourceCodeEnd":396,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs#L360-L396","documentation":"Thrown at the top of Salvage5Star when this.maxNumToCheck is null. maxNumToCheck caps how many artifacts the loop inspects; a null means the param was not configured. Like 147, Start should gate Salvage5Star behind a JS-presence check, and reaching this throw implies a misconfigured AutoArtifactSalvageTaskParam.","triggerScenarios":"AutoArtifactSalvageTaskParam.MaxNumToCheck left null while JavaScript is set; param deserialization missing the field; Salvage5Star invoked without populating maxNumToCheck.","commonSituations":"User supplied a JS filter but no 'max to check' value; schema change dropped the field; default value not applied during param construction.","solutions":["Set AutoArtifactSalvageTaskParam.MaxNumToCheck to a positive int when configuring JS salvage.","Default MaxNumToCheck in the param constructor or property initializer.","Validate required fields together (JavaScript, MaxNumToCheck, RecognitionFailurePolicy) in the task constructor.","Surface a single configuration error to the user before Start runs."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (param.MaxNumToCheck is null or <= 0)\n    throw new ArgumentException(\"maxNumToCheck 必须为正整数\", nameof(param.MaxNumToCheck));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default MaxNumToCheck in AutoArtifactSalvageTaskParam.","Validate alongside JavaScript and RecognitionFailurePolicy together.","Reject the configuration early rather than mid-task."],"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"}