"The argument type 'String?' can't be assigned to the parameter type 'String'" 使用 stdin.readLineSync() 时
"The argument type 'String?' can't be assigned to the parameter type 'String'" when using stdin.readLineSync()
我是飞镖新手。我不知道我犯了什么样的错误,但这段代码没有用。
是一个简单的代码,只需读取终端中的年龄并说它是未成年人或18岁以上。
import 'dart:io';
main(){
print("Entre com a sua idade: ");
var input = stdin.readLineSync();
var idade = int.parse(input);
if(idade >= 18){
print("É maior de idade");
}else{
print("É menor de idade");
}
}
我收到这个错误:
algoritmo01.dart:15:25: Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
var idade = int.parse(input);
欢迎使用 Dart。您所体验到的是新的空值安全特性(在 Dart 2.12.0 中引入),默认情况下变量不能包含值 null。这是静态检查的,因此即使在执行程序之前您也会收到错误。
在您的示例中,问题在于以下行:
var input = stdin.readLineSync();
如果我们查看手册,我们可以看到此方法具有以下签名:
String? readLineSync (
{Encoding encoding = systemEncoding,
bool retainNewlines = false}
)
https://api.dart.dev/stable/2.12.2/dart-io/Stdin/readLineSync.html
String?
表示它是可空类型,因此允许包含任何字符串或空值。如果类型改为 String
,则意味着结果只能是 String
而不是 null
.
这意味着您的变量 input
现在具有类型 String?
。如果您查看示例的第二行,这(在 2.12.0 中引入)是一个问题:
var idade = int.parse(input);
因为int.parse
的签名是:
int parse (
String source,
{int? radix,
@deprecated int onError(
String source
)}
)
https://api.dart.dev/stable/2.12.2/dart-core/int/parse.html
需要 String
(因此永远不会是 null
)。因此,您不能将 String?
作为仅处理 String
的方法的参数。相反的情况是允许的(如果方法采用 String?
并且你给它一个 String
)。
那么对于这种情况我们能做些什么呢?那么,你需要处理 null
的情况,或者告诉 Dart 如果 input
是 null
.
它应该让你的程序崩溃
所以你可以这样处理:
import 'dart:io';
void main() {
print("Entre com a sua idade: ");
var input = stdin.readLineSync();
if (input != null) {
var idade = int.parse(input);
if (idade >= 18) {
print("É maior de idade");
} else {
print("É menor de idade");
}
} else {
print('Input was null!');
}
}
如您所见,即使 input
在技术上仍属于 String?
类型,也是允许的。但是 Dart 可以看到您的 if
语句将阻止 input
具有值 null
因此只要您在此 if- 中,它就会被“提升”为 String
声明。
另一种解决方案是告诉 Dart 它应该停止抱怨关于 input
的静态错误,并且在编译代码时假设 input
是 String
:
import 'dart:io';
void main() {
print("Entre com a sua idade: ");
var input = stdin.readLineSync()!;
var idade = int.parse(input);
if (idade >= 18) {
print("É maior de idade");
} else {
print("É menor de idade");
}
}
(变化是在readLineSync()
之后添加的!
)
在这种情况下,Dart 将添加自己的 null
-检查,如果 stdin.readLineSync
确实给出了 null
值,程序就会崩溃。这是为了确保我们永远不会给 int.parse
一个空值,这可能会使您的代码在其他地方崩溃。通过添加 null
-检查我们在何处获得可疑值,我们可以确保我们快速失败并在事情与我们预期不同的地方失败。
您可以在此处阅读更多有关 Dart 中的空安全性的信息(也由 Stephen 链接):https://dart.dev/null-safety/understanding-null-safety
接受的答案是正确的。但还有另一种替代解决方案。您可以像这样使用“if null”运算符:
var idade = int.parse(input ?? "-1");
完整代码如下所示:
import 'dart:io';
main(){
print("Entre com a sua idade: ");
var input = stdin.readLineSync();
var idade = int.parse(input ?? "-1");
if(idade >= 18){
print("É maior de idade");
}else if(idade < 18 && idade > 0){
print("É menor de idade");
} else {
print("entrada errada");
}
}
字符串?意味着它可能是一个字符串或空值。但是,我们需要将 non-null 值传递给 int.parse
。错误说那个字符串?可以为 null 但 String 不是。
要修复此错误,您需要在尝试解析值之前检查是否为 null。
使用tryParse()
方法而不是int.parse()
void main() {
var yourValue = stdin.readLineSync();
if(yourValue != null){
var parsedValue = int.tryParse(yourValue);
}
}
parse()
和tryParse()
有什么区别?
parse()
为无效输入字符串抛出 FormatException
tryParse()
returns 无效输入字符串为 null
我是飞镖新手。我不知道我犯了什么样的错误,但这段代码没有用。 是一个简单的代码,只需读取终端中的年龄并说它是未成年人或18岁以上。
import 'dart:io';
main(){
print("Entre com a sua idade: ");
var input = stdin.readLineSync();
var idade = int.parse(input);
if(idade >= 18){
print("É maior de idade");
}else{
print("É menor de idade");
}
}
我收到这个错误:
algoritmo01.dart:15:25: Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
var idade = int.parse(input);
欢迎使用 Dart。您所体验到的是新的空值安全特性(在 Dart 2.12.0 中引入),默认情况下变量不能包含值 null。这是静态检查的,因此即使在执行程序之前您也会收到错误。
在您的示例中,问题在于以下行:
var input = stdin.readLineSync();
如果我们查看手册,我们可以看到此方法具有以下签名:
String? readLineSync (
{Encoding encoding = systemEncoding,
bool retainNewlines = false}
)
https://api.dart.dev/stable/2.12.2/dart-io/Stdin/readLineSync.html
String?
表示它是可空类型,因此允许包含任何字符串或空值。如果类型改为 String
,则意味着结果只能是 String
而不是 null
.
这意味着您的变量 input
现在具有类型 String?
。如果您查看示例的第二行,这(在 2.12.0 中引入)是一个问题:
var idade = int.parse(input);
因为int.parse
的签名是:
int parse (
String source,
{int? radix,
@deprecated int onError(
String source
)}
)
https://api.dart.dev/stable/2.12.2/dart-core/int/parse.html
需要 String
(因此永远不会是 null
)。因此,您不能将 String?
作为仅处理 String
的方法的参数。相反的情况是允许的(如果方法采用 String?
并且你给它一个 String
)。
那么对于这种情况我们能做些什么呢?那么,你需要处理 null
的情况,或者告诉 Dart 如果 input
是 null
.
所以你可以这样处理:
import 'dart:io';
void main() {
print("Entre com a sua idade: ");
var input = stdin.readLineSync();
if (input != null) {
var idade = int.parse(input);
if (idade >= 18) {
print("É maior de idade");
} else {
print("É menor de idade");
}
} else {
print('Input was null!');
}
}
如您所见,即使 input
在技术上仍属于 String?
类型,也是允许的。但是 Dart 可以看到您的 if
语句将阻止 input
具有值 null
因此只要您在此 if- 中,它就会被“提升”为 String
声明。
另一种解决方案是告诉 Dart 它应该停止抱怨关于 input
的静态错误,并且在编译代码时假设 input
是 String
:
import 'dart:io';
void main() {
print("Entre com a sua idade: ");
var input = stdin.readLineSync()!;
var idade = int.parse(input);
if (idade >= 18) {
print("É maior de idade");
} else {
print("É menor de idade");
}
}
(变化是在readLineSync()
之后添加的!
)
在这种情况下,Dart 将添加自己的 null
-检查,如果 stdin.readLineSync
确实给出了 null
值,程序就会崩溃。这是为了确保我们永远不会给 int.parse
一个空值,这可能会使您的代码在其他地方崩溃。通过添加 null
-检查我们在何处获得可疑值,我们可以确保我们快速失败并在事情与我们预期不同的地方失败。
您可以在此处阅读更多有关 Dart 中的空安全性的信息(也由 Stephen 链接):https://dart.dev/null-safety/understanding-null-safety
接受的答案是正确的。但还有另一种替代解决方案。您可以像这样使用“if null”运算符:
var idade = int.parse(input ?? "-1");
完整代码如下所示:
import 'dart:io';
main(){
print("Entre com a sua idade: ");
var input = stdin.readLineSync();
var idade = int.parse(input ?? "-1");
if(idade >= 18){
print("É maior de idade");
}else if(idade < 18 && idade > 0){
print("É menor de idade");
} else {
print("entrada errada");
}
}
字符串?意味着它可能是一个字符串或空值。但是,我们需要将 non-null 值传递给 int.parse
。错误说那个字符串?可以为 null 但 String 不是。
要修复此错误,您需要在尝试解析值之前检查是否为 null。
使用tryParse()
方法而不是int.parse()
void main() {
var yourValue = stdin.readLineSync();
if(yourValue != null){
var parsedValue = int.tryParse(yourValue);
}
}
parse()
和tryParse()
有什么区别?
parse()
为无效输入字符串抛出 FormatException
tryParse()
returns 无效输入字符串为 null