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
- Check that materialName is non-empty before constructing CraftMaterialTask.
- Validate user input at the UI/config layer and prompt for a required material name.
- 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
- Validate material name at the input/config layer before constructing the task.
- Use a constructor guard or factory that rejects empty names early.
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.