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

Dart中如何获取用户输入?解决String?类型赋值报错问题

Dart标准输入读取空安全报错修复

报错根因

该报错由Dart空安全机制触发:stdin.readLineSync() 的方法返回值为可空类型 String?——读取标准输入时如果遇到流异常、提前关闭的场景,方法会返回null。原代码中将该返回值直接赋值给了非空类型String的变量name,类型不匹配因此触发编译错误。
另外原代码存在笔误:收集姓名输入时,打印输出的提示却写成了年龄相关内容。

具体修复方案

  • 方案1:适配可空返回值
    将变量声明为可空类型,匹配readLineSync的返回类型,适合临时测试场景

    import 'dart:io';
    void main() {
      // 用stdout.write做提示,避免输入光标自动换到下一行
      stdout.write('What is your name: ');
      String? name = stdin.readLineSync();
      // 修正原代码的笔误,正确输出姓名
      print('Your name is = $name');
    }
    

    这种写法下如果读取返回null,打印结果会直接显示null。

  • 方案2:空值兜底赋默认值
    使用Dart空合并运算符??,当读取结果为null时给变量设置默认非空值,保证变量始终是非空String类型

    import 'dart:io';
    void main() {
      stdout.write('What is your name: ');
      // 读取结果为null时,兜底为"未填写"
      String name = stdin.readLineSync() ?? "未填写";
      print('Your name is = $name');
    }
    
  • 方案3:非空断言赋值
    使用!非空断言符,告知编译器当前返回值一定不为null,可直接赋值给非空变量

    import 'dart:io';
    void main() {
      stdout.write('What is your name: ');
      // 强制断言返回值非空
      String name = stdin.readLineSync()!;
      print('Your name is = $name');
    }
    

    注意:如果运行时真的读取到null,这种写法会直接抛出运行时异常,不建议在生产环境使用。


内容的提问来源于stack exchange,提问作者Ateeb Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 12:06:02