{"record":{"id":"b405b980d9bdb01f","repo":"babalae/better-genshin-impact","slug":"0-b405b9","errorCode":null,"errorMessage":"合成个数必须大于 0。","messagePattern":"合成个数必须大于 0。","errorType":"validation","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/Common/Job/CraftMaterialTask.cs","lineNumber":167,"sourceCode":"            FormatRewards(rewards));\n        return CraftMaterialResult.CreateSuccess(_materialName, _targetQuantity, adjustedQuantity, materialType, rewards);\n    }\n\n    /// <summary>\n    /// 校验任务构造参数。\n    /// </summary>\n    /// <exception cref=\"ArgumentException\">材料名为空时抛出。</exception>\n    /// <exception cref=\"ArgumentOutOfRangeException\">合成个数小于等于 0 时抛出。</exception>\n    private void ValidateArguments()\n    {\n        if (string.IsNullOrWhiteSpace(_materialName))\n        {\n            throw new ArgumentException(\"材料名不能为空。\", nameof(_materialName));\n        }\n\n        if (_targetQuantity <= 0)\n        {\n            throw new ArgumentOutOfRangeException(nameof(_targetQuantity), _targetQuantity, \"合成个数必须大于 0。\");\n        }\n    }\n\n    /// <summary>\n    /// 解析材料筛选类型，优先使用调用方显式传入的类型。\n    /// </summary>\n    /// <returns>材料筛选类型。</returns>\n    /// <exception cref=\"InvalidOperationException\">未传入材料类型且 CSV 中没有对应材料类型时抛出。</exception>\n    private string ResolveMaterialType()\n    {\n        if (!string.IsNullOrWhiteSpace(_materialType))\n        {\n            return _materialType;\n        }\n\n        if (MaterialTypes.Value.TryGetValue(_materialName, out var materialType) && !string.IsNullOrWhiteSpace(materialType))\n        {\n            return materialType;","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/Common/Job/CraftMaterialTask.cs#L149-L185","documentation":"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.","triggerScenarios":"Constructing new CraftMaterialTask(\"树脂\", 0) or new CraftMaterialTask(\"树脂\", -5), then calling Start(ct).","commonSituations":"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.","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."],"exampleFix":"// before\nvar task = new CraftMaterialTask(\"树脂\", computedQty); // computedQty could be 0\n\n// after\nif (computedQty <= 0) { /* nothing to craft */ return; }\nvar task = new CraftMaterialTask(\"树脂\", Math.Max(1, computedQty));","handlingStrategy":"validation","validationCode":"if (targetQuantity <= 0)\n{\n    // nothing to craft — skip or clamp\n    return;\n}","typeGuard":"static bool IsValidQuantity(int qty) => qty > 0;","tryCatchPattern":"try { await task.Start(ct); }\ncatch (ArgumentOutOfRangeException) { /* fix quantity, retry */ }","preventionTips":["Clamp computed quantities to at least 1 at the caller.","Validate user-input quantities in the UI before passing to the task."],"tags":["validation","crafting","argument-error"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}