问题描述
import 'dart:io';
main() {
print("CALculaTOR");
stdout.write("Number a: ");
double a = double.parse(stdin.readLinesync());
stdout.write("Number b: ");
double b = double.parse(stdin.readLinesync());
double result;
// operator +
result = a + b;
print("$a + $b = $result");
// operator -
result = a - b;
print("$a - $b = $result");
// operator *
result = a * b;
print("$a * $b = $hasil");
// operator /
result = a / b;
print("$a / $b = $result");
// operator %
result = a % b;
print("$a % $b = $result");
}
这是我的问题:
myLearning/myNote/test.dart:7:33: Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
double a = double.parse(stdin.readLinesync());
^
myLearning/myNote/test.dart:9:33: Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
double b = double.parse(stdin.readLinesync());
我只想输入一个数字,结果是这样的:
CALculaTOR
Number a : 9
Number b : 2
9.0 + 2.0 = 11.0
9.0 - 2.0 = 7.0
9.0 * 2.0 = 18.0
9.0 / 2.0 = 4.5
9.0 % 2.0 = 1.0
我可以像上面那样输入吗?
解决方法
您的“问题”是您使用的是 Dart 2.12 的测试版,它启用了不可为空的功能。此功能将帮助您确保您了解可能发生空值的所有情况。在您的情况下,它是对 stdin.readLineSync()
的调用:
如果输入结束之前没有字节,则返回 null。
您收到错误,因为 double.parse
将 String
作为参数,但 stdin.readLineSync()
返回 String?
,它是一种可以是 String
或null
(其中 String
只允许 String
,永远不能是 null
)。
简单的解决方法是执行以下操作并在 !
之后插入 readLineSync()
:
import 'dart:io';
void main() {
print("CALCULATOR");
stdout.write("Number a: ");
double a = double.parse(stdin.readLineSync()!);
stdout.write("Number b: ");
double b = double.parse(stdin.readLineSync()!);
double result;
// operator +
result = a + b;
print("$a + $b = $result");
// operator -
result = a - b;
print("$a - $b = $result");
// operator *
result = a * b;
print("$a * $b = $result");
// operator /
result = a / b;
print("$a / $b = $result");
// operator %
result = a % b;
print("$a % $b = $result");
}
通过执行 !
,您告诉 Dart 您确定该值不为 null,并且分析器应该只接受该值,就好像它永远不会是 null
一样。
在运行时,如果 null
的返回值为 stdin.readLineSync()
,Dart 将添加对 null
的运行时检查并导致程序崩溃(带有 NullPointerException)。但是由于我们正在开发一个小示例程序,所以这完全没问题。
您可以在此处阅读有关默认非空值 (NNBD) 的更多信息:https://dart.dev/null-safety