You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:57:12