正如您在 的文档中所读到的num.tryParse,该方法的返回类型为num?. 这意味着您的变量n也是类型num?(Nullable num)。
因此,错误会将您指向要从 中减去可为空数的行DateTime.now().year,这是不允许的。
您可以通过使用??(Null coalescing) 运算符并检查 null 以及是否n减去null0 来解决此限制。
var age = DateTime.now().year - (n ?? 0) ;
另一种解决方案是,仅使用if检查 null 后跟一个else块,例如:
if(n == null) {
print("Bad Year");
}
else {
var age = DateTime.now(). year - n ;
print(" ==> You are $age year old!");
}
接受您的评论:
我加了!在 n 之后并且工作正常......这是相同的解决方案吗?
将空断言运算符( !) 添加到ninDateTime.now().year - n!不是相同的解决方案,但它是一种可能的解决方案。正如您已经提到的那样,它可以编译并工作。
但要小心:
你告诉编译器你确定,那n永远不会为空。
使用您当前的代码,当用户输入字母或不输入任何内容时,您将收到运行时错误。然后该字符串的解析失败并且您的n为空。现在你想从 中减去null,DateTime.now().year这也是不允许的。
您可以在https://dart.dev/codelabs/null-safety上阅读有关 Null-Safety 的更多信息。
边注:
以下检查不正确:
if(n=="") {
print("Bad Year");
}
如果输入了不正确的数字,则您的nisnull和 this 不等于空字符串。要使您的 if 子句起作用,只需使用空检查。我还建议return在输出后添加一个,否则你的人会变老。
if(n == null) {
print("Bad Year");
return;
}