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
相关产品推荐
相关产品推荐

