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
- Clamp the target quantity to at least 1 before constructing the task.
- Validate the quantity at the input layer (UI or config parser).
- 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
- Clamp computed quantities to at least 1 at the caller.
- Validate user-input quantities in the UI before passing to the task.
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.