babalae/better-genshin-impact · error · ArgumentException

材料名不能为空。

Error message

材料名不能为空。

What it means

Thrown as ArgumentException by CraftMaterialTask.ValidateArguments when _materialName is null, empty, or whitespace-only after trimming. The task is constructed with a material name; without one there is nothing to synthesize and the downstream CSV lookup, UI search, and OCR confirmation all depend on it.

Source

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

        var rewards = await SubmitCraftAndClaimResult(adjustedQuantity);

        _logger.LogInformation("材料 {MaterialName} 合成完成,实际设置个数:{Quantity},产物:{Rewards}",
            _materialName,
            adjustedQuantity,
            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;

View on GitHub (pinned to a7cb36712d)

Solutions

  1. Check that materialName is non-empty before constructing CraftMaterialTask.
  2. Validate user input at the UI/config layer and prompt for a required material name.
  3. Default to a known material or abort the task if no name is provided.

Example fix

// before
var task = new CraftMaterialTask(userInput, 10); // userInput could be ""
await task.Start(ct);

// after
if (string.IsNullOrWhiteSpace(userInput)) { /* reject early */ return; }
var task = new CraftMaterialTask(userInput, 10);
await task.Start(ct);
Defensive patterns

Strategy: validation

Validate before calling

if (string.IsNullOrWhiteSpace(materialName))
{
    // reject before constructing the task
    return;
}

Type guard

static bool IsValidMaterialName(string? name) => !string.IsNullOrWhiteSpace(name?.Trim());

Try / catch

try { await task.Start(ct); }
catch (ArgumentException ex) when (ex.Message.Contains("材料名不能为空")) { /* prompt for name */ }

Prevention

When it happens

Trigger: Constructing new CraftMaterialTask("", 5) or new CraftMaterialTask(null, 5) or new CraftMaterialTask(" ", 5), then calling Start(ct) which calls ValidateArguments().

Common situations: The material name came from user config input that was left blank. A script passed an uninitialized or default string variable. The name was read from a file/database that returned an empty value.

Related errors


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