参考: https://www.dartcn.com/guides/language/language-tour#callable-classes
控制流程语句
Dart
语言中的控制流程语句主要有以下几个:
- if-else
- for
- while
- break-continue
- switch
- assert
if-else
Dart
支持if - else
语句,其中 else
是可选的。
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
for 循环
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
print(message);
输出:
Dart is fun!!!!!
实现了 Iterable
的类(比如, List 和 Set)同样也支持使用 for-in
进行迭代操作 iteration :
var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}
输出:
0
1
2
while 和 do-while
while
循环在执行前判断执行条件,条件通过则执行代码块中的代码,否则跳过。
while (!isDone()) {
doSomething();
}
do-while
循环在执行后判断执行条件,会执行一次代码块中的内容,如果 while()
中条件不符合则下次执行不在进入循环体。
do {
printLine();
} while (!atEndOfPage());
break 和 continue
使用 break
停止程序循环
使用 continue
跳转到下一次迭代
switch 和 case
在 Dart
中 switch
语句使用 ==
比较整数,字符串,或者编译时常量。
在 case
语句中,每个非空的 case
语句结尾需要跟一个 break
语句。 除 break
以外,还有可以使用 continue, throw,者 return
。
下面的 case
程序示例中缺省了break
语句,导致错误:
void main() {
var command = 'OPEN';
switch (command) {
case 'OPEN':
print("open");
// ERROR: 丢失 break
// break;
case 'CLOSED':
print("closed");
break;
}
}
下面的 case
程序示例中展示了 除 break
以外,还有可以使用 continue, throw,者 return
。:
void main() {
var command = 'OPEN';
switch (command) {
case 'OPEN':
print("open");
// ERROR: 丢失 break
// break;
continue nowClosed;
case 'FAIL':
print("fail");
break;
nowClosed:
case 'CLOSED':
print("closed");
break;
}
}
输出:
open
closed
assert
提示: assert 语句只在开发环境中有效, 在生产环境是无效的;
如果 assert
语句中的布尔条件为 false
, 那么正常的程序执行流程会被中断。
// 确认变量值不为空。
assert(text != null);
// 确认变量值小于100。
assert(number < 100);
// 确认 URL 是否是 https 类型。
assert(urlString.startsWith('https'));
异常
Dart 代码可以抛出和捕获异常。 异常表示一些未知的错误情况。 如果异常没有被捕获, 则异常会抛出, 导致抛出异常的代码终止执行。
和 Java 有所不同, Dart 中的所有异常是非检查异常。 方法不会声明它们抛出的异常, 也不要求捕获任何异常。
throw
下面是关于抛出或者 引发 异常的示例:
throw FormatException('Expected at least 1 section');
也可以抛出任意的对象:
throw 'Out of llamas!';
catch
捕获异常可以避免异常继续传递(除非重新抛出( rethrow )异常)。 可以通过捕获异常的机会来处理该异常:
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
finally
不管是否抛出异常, finally 中的代码都会被执行。 如果 catch 没有匹配到异常, 异常会在 finally 执行完成后,再次被抛出:
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // Handle the exception first.
} finally {
cleanLlamaStalls(); // Then clean up.
}