为什么我在Dart中会遇到这些错误?附代码及报错详情
Dart罗马数字转整数:空安全错误分析与解决
错误原因
这两个错误都源于Dart的空安全机制:
- 运算符
<无法调用:roman[s[i]]的返回类型是int?(可空整数),如果输入字符串s包含不在roman映射表中的字符,这个表达式会返回null,而null不能直接参与<比较运算。 - 参数类型不匹配:
result是int类型(非空),但roman[s[i]]是int?,直接用来做加减操作时,可空类型无法直接赋值给非空的num(int是num的子类)参数。
解决方法
根据需求,有两种常见处理方式:
方式1:确保输入为合法罗马数字,强制断言非空
如果你能保证传入的s只包含I、V、X、L、C、D、M这些合法字符,可以用!强制断言roman[s[i]]不为null,明确告诉编译器该值一定存在:
void main() { int romanToInt(String s) { Map<String, int> roman = { 'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000 }; int result = 0; for(int i=0; i<s.length; i++){ final current = roman[s[i]]!; final next = i+1 < s.length ? roman[s[i+1]]! : 0; if(i+1 < s.length && current < next){ result -= current; } else { result += current; } } print(result); return result; } }
方式2:兼容非法字符,提供默认值
如果需要处理可能的非法字符,可以用??运算符给roman[s[i]]设置默认值(比如0),避免空值报错:
void main() { int romanToInt(String s) { Map<String, int> roman = { 'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000 }; int result = 0; for(int i=0; i<s.length; i++){ final current = roman[s[i]] ?? 0; final next = i+1 < s.length ? (roman[s[i+1]] ?? 0) : 0; if(i+1 < s.length && current < next){ result -= current; } else { result += current; } } print(result); return result; } }
额外优化
你代码里的s=s;是多余的,直接删掉即可,不影响逻辑。
内容的提问来源于stack exchange,提问作者irfan ap
相关产品推荐
相关产品推荐

