babalae/better-genshin-impact · error · ArgumentException

maxNumToCheck不能为空

Error message

maxNumToCheck不能为空

What it means

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.

Source

Thrown at BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs:378

            // 逐一点选查看面板筛选
            await Salvage5Star();
            logger.LogInformation("筛选完毕,请复查并手动分解");
        }
        else
        {
            input.Keyboard.KeyPress(User32.VK.VK_ESCAPE);

            if (returnToMainUi)
            {
                await new ReturnMainUiTask().Start(ct);
            }
        }
    }

    private async Task Salvage5Star()
    {
        string javaScript = this.javaScript ?? throw new ArgumentException($"{nameof(this.javaScript)}不能为空");
        int count = this.maxNumToCheck ?? throw new ArgumentException($"{nameof(this.maxNumToCheck)}不能为空");
        RecognitionFailurePolicy recognitionFailurePolicy = this.recognitionFailurePolicy ?? throw new ArgumentException($"{nameof(this.recognitionFailurePolicy)}不能为空");

        GridParams gridParams = GridParams.Templates[GridScreenName.ArtifactSalvage];
        GridScreen gridScreen = new GridScreen(gridParams, this.logger, this.ct); // 圣遗物分解Grid有4行9列
        gridScreen.OnAfterTurnToNewPage += GridScreen.DrawItemsAfterTurnToNewPage;
        gridScreen.OnBeforeScroll += () => VisionContext.Instance().DrawContent.ClearAll();
        try
        {
            await foreach ((ImageRegion pageRegion, Rect itemRect) in gridScreen)
            {
                using ImageRegion itemRegion = pageRegion.DeriveCrop(itemRect);
                Rect gridRect = itemRegion.ToRect();
                if (GetArtifactStatus(itemRegion.SrcMat) == ArtifactStatus.None)
                {
                    itemRegion.Click();
                    await Delay(300, ct);

                    using var ra1 = CaptureToRectArea();

View on GitHub (pinned to a7cb36712d)

Solutions

  1. Set AutoArtifactSalvageTaskParam.MaxNumToCheck to a positive int when configuring JS salvage.
  2. Default MaxNumToCheck in the param constructor or property initializer.
  3. Validate required fields together (JavaScript, MaxNumToCheck, RecognitionFailurePolicy) in the task constructor.
  4. Surface a single configuration error to the user before Start runs.
Defensive patterns

Strategy: validation

Validate before calling

if (param.MaxNumToCheck is null or <= 0)
    throw new ArgumentException("maxNumToCheck 必须为正整数", nameof(param.MaxNumToCheck));

Prevention

When it happens

Trigger: AutoArtifactSalvageTaskParam.MaxNumToCheck left null while JavaScript is set; param deserialization missing the field; Salvage5Star invoked without populating maxNumToCheck.

Common situations: User supplied a JS filter but no 'max to check' value; schema change dropped the field; default value not applied during param construction.

Related errors


AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13). Data as JSON: /api/errors/4bd04925a4ace81f. Report an issue: GitHub.