babalae/better-genshin-impact · error · ArgumentOutOfRangeException

合成个数必须大于 0。

Error message

合成个数必须大于 0。

What it means

Thrown as ArgumentOutOfRangeException by CraftMaterialTask.ValidateArguments when _targetQuantity is less than or equal to zero. The crafting task needs a positive integer count; zero or negative makes no sense for the slider adjustment logic and the increment/decrement loops.

Source

Thrown at BetterGenshinImpact/GameTask/Common/Job/CraftMaterialTask.cs:167

            FormatRewards(rewards));
        return CraftMaterialResult.CreateSuccess(_materialName, _targetQuantity, adjustedQuantity, materialType, rewards);
    }

    /// <summary>
    /// 校验任务构造参数。
    /// </summary>
    /// <exception cref="ArgumentException">材料名为空时抛出。</exception>
    /// <exception cref="ArgumentOutOfRangeException">合成个数小于等于 0 时抛出。</exception>
    private void ValidateArguments()
    {
        if (string.IsNullOrWhiteSpace(_materialName))
        {
            throw new ArgumentException("材料名不能为空。", nameof(_materialName));
        }

        if (_targetQuantity <= 0)
        {
            throw new ArgumentOutOfRangeException(nameof(_targetQuantity), _targetQuantity, "合成个数必须大于 0。");
        }
    }

    /// <summary>
    /// 解析材料筛选类型,优先使用调用方显式传入的类型。
    /// </summary>
    /// <returns>材料筛选类型。</returns>
    /// <exception cref="InvalidOperationException">未传入材料类型且 CSV 中没有对应材料类型时抛出。</exception>
    private string ResolveMaterialType()
    {
        if (!string.IsNullOrWhiteSpace(_materialType))
        {
            return _materialType;
        }

        if (MaterialTypes.Value.TryGetValue(_materialName, out var materialType) && !string.IsNullOrWhiteSpace(materialType))
        {
            return materialType;

View on GitHub (pinned to a7cb36712d)

Solutions

  1. Clamp the target quantity to at least 1 before constructing the task.
  2. Validate the quantity at the input layer (UI or config parser).
  3. If the computed quantity is <= 0, skip crafting entirely since there is nothing to make.

Example fix

// before
var task = new CraftMaterialTask("树脂", computedQty); // computedQty could be 0

// after
if (computedQty <= 0) { /* nothing to craft */ return; }
var task = new CraftMaterialTask("树脂", Math.Max(1, computedQty));
Defensive patterns

Strategy: validation

Validate before calling

if (targetQuantity <= 0)
{
    // nothing to craft — skip or clamp
    return;
}

Type guard

static bool IsValidQuantity(int qty) => qty > 0;

Try / catch

try { await task.Start(ct); }
catch (ArgumentOutOfRangeException) { /* fix quantity, retry */ }

Prevention

When it happens

Trigger: Constructing new CraftMaterialTask("树脂", 0) or new CraftMaterialTask("树脂", -5), then calling Start(ct).

Common situations: The quantity was read from user config as 0 by default or parsed from invalid input that fell back to 0. A calculation (e.g., totalNeeded - currentOwned) underflowed to zero or negative. A script defaulted quantity to 0.

Related errors


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