Julia中ArgumentError(无效十进制数字)问题排查求助
问题分析
错误的核心原因是代码第一个if分支直接调用parse(Int, ws[i])——当当前单词不是合法整数字符串时,parse会直接抛出ArgumentError。比如测试用例里的"I"、"My"都无法解析为整数,因此触发报错。
另外代码还有两个潜在问题:
- 未判断
i+1是否超出数组长度,循环到最后一个单词时,访问ws[i+1]会引发越界错误 - 存在重复的条件判断(
ws[i] in ["a", "an"]出现在两个elseif分支),逻辑顺序不合理,导致不定冠词替换的分支永远不会被执行
修复方案
- 用
tryparse替代parse:tryparse无法解析时返回nothing,不会抛出错误,适合做前置判断 - 添加数组边界检查:所有访问
ws[i+1]的逻辑都要先确保i < length(ws) - 调整条件顺序,合并重复逻辑:先处理不定冠词替换,再处理单数形式转换,避免分支覆盖
- 用
join优化字符串拼接,提升效率
修复后的代码:
function grmr(s) ws = split(s, " ") for i in 1:length(ws) # 处理数字+名词的情况,先判断是否为合法整数,且不是最后一个单词 num = tryparse(Int, ws[i]) if num !== nothing && i < length(ws) ws[i+1] = ItemQuantity(num, ws[i+1]) ws[i] = "" # 处理不定冠词替换(a/an),优先执行避免被后续分支覆盖 elseif ws[i] in ["a", "an"] && i < length(ws) ws[i] = indefinite(ws[i+1]) ws[i+1] = singularize(ws[i+1]) # 处理要求复数的修饰词 elseif ws[i] in ["many", "multiple", "numerous", "several", "few", "some"] && i < length(ws) ws[i+1] = pluralize(singularize(ws[i+1])) # 处理要求单数的修饰词 elseif ws[i] in ["single"] && i < length(ws) ws[i+1] = singularize(ws[i+1]) # 处理单词末尾s的情况(确保复数形式正确) elseif endswith(ws[i], "s") ws[i] = pluralize(singularize(ws[i])) end end # 过滤空字符串后拼接 return join(filter(!isempty, ws), " ") end
测试验证
运行grmr("I have a apple")会返回"I have an apple",grmr("My favorite is a apple")会返回"My favorite is an apple",符合预期且不再触发报错。
内容的提问来源于stack exchange,提问作者Dark Shadow
相关产品推荐
相关产品推荐

