如何解决值可以为“空”的表达式必须先进行空检查,然后才能取消引用
我正在使用具有零安全模式的 Dart。我在下一个代码中有问题。
List<JobModel> _jobList = [];
// ...
if(_jobList.isNotEmpty) {
for(var job in _jobList) {
if(job.cmd_args != null) {
numbersOfAlreadyActiveJobs.addAll(job.cmd_args.replaceAll('(','').replaceAll(')','').split('=')[1].split(',').map(int.parse).toList());
}
}
我 我收到下一个错误:
但是为什么呢?我正在检查 job.cmd_args != null
解决方法
Dart 仅提升局部变量,这适用于类型和空性。
当您执行 if (job.cmd_args != null) ...
时,它不允许编译器假定 job.cmd_args
的任何后续评估也将返回非空值。在不了解整个程序的情况下,它无法知道这一点(以确保没有任何东西实现 JobModel
,其中 cmd_args
可能是在下一次调用时执行不同操作的 getter)。即使它知道这一点,我们也不希望本地类型提升依赖于全局信息。这使它太脆弱,你不能依赖它。有人在其他地方添加类可能会使您的代码不再升级,因此不再编译。
所以,你的测试还不够。
您可以做的是说“我知道我在做什么”并将 !
添加到 job.cmd_args!.replaceAll
。这是对不可为空类型的运行时转换,如果该值在第二次读取时实际上是 null
,它将抛出(这可能不会,但编译器不满足于“可能"s).
或者,您可以引入一个局部变量,可以将其提升为非空:
var args = job.cmd_args;
if (args != null) {
numberOfAlreadyActiveJobs.addAll(args.replaceAll(...));
}
这里引入了一个新的本地变量,args
,然后检查那个是否为null
。如果不是,那么稍后您可以安全地将其用作非null
,因为局部变量不会受到其他任何地方的代码的影响,因此编译器相信在您使用它时它确实会具有相同的值稍后。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。