记录Dart第四章-流程控制。
流程控制
本文记录
Dart
流程控制及异常处理。
if
andelse
for
loopswhile
anddo while
loopsbreak
andcontinue
switch
andcase
assert
if and else
与大部分通用语言一致
1
2
3
4
5
6
7
8
9
10
11
void testIfElse(int age) {
var msg;
if (age > 0 && age <= 20) {
msg = "青少年";
} else if (age > 20 && age < 100) {
msg = "中老年";
} else {
msg = "仙人";
}
print(msg);
}
for loops
与大部分通用语言一致
1
2
3
4
5
6
void testForLoops() {
const list = ["a","b","c"];
for (var i = 0; i < list.length; i++) {
print(list[i]);
}
}
Dart
中的for
循环中的闭包会捕获循环的index
。
1
2
3
4
5
6
7
void testElsLoops() {
var list = [];
for (var i = 0; i < 2; i++) {
list.add(() => print(i));
}
list.forEach((c) => c());
}
如果要遍历的对象实现了Iterable
接口,则可以使用 forEach() 方法。如果没必要当前遍历的索引,则使用forEach()更加简洁:
1
2
3
var list = ["a", "b", "c"];
list.forEach((s) => print(s));
List
和 Set
等实现了 Iterable
接口的类还支持 for-in
形式的遍历:
1
2
3
4
5
var list = ["a", "b", "c"];
for (var item in list) {
print(item);
}
while and do…while
与其他通用语言一致。
1
2
3
4
5
6
7
8
9
10
void testWhile() {
var list = ["a", "b", "c"];
var index = 0;
while (index < list.length) {
print(list[index]);
index++;
}
}
1
2
3
4
5
6
7
8
9
10
void testDoWhile() {
var list = ["a", "b", "c"];
var index = 0;
do {
print(list[index]);
index++;
} while (index < list.length);
}
break and continue
break
1
2
3
4
5
6
7
8
9
void testBreak() {
const list = ["a", "b", "c"];
for (var i = 0; i < list.length; i++) {
print(list[i]);
if (i == 1) {
break;
}
}
}
continue
1
2
3
4
5
6
7
8
9
void testContinue() {
const list = ["a", "b", "c"];
for (var i = 0; i < list.length; i++) {
if (i == 1) {
continue;
}
print(list[i]);
}
}
或者
1
list.where((c) => c != "b").forEach((c) => print(c));
switch case
Dart
中的Switch
语句使用==
比较integer
、string
或者编译时常量,比较的对象必须时同一个类的实例,class
必须没有覆盖==
操作符。
每个非空的case
语句必须有一个break
语句,另外可以通过continue
、throw
或者return
来结束非空case
语句,当没有case
语句匹配的时候,可以使用default
语句来匹配这种情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var CMD = "OPEN";
switch (CMD) {
case "CLOSED":
print("closed");
break;
case "OPEN":
print("open");
break;
case "PENDING":
print("pending");
break;
default:
print("default");
}
也可以通过continue
跳转到指定的label处执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var CMD = "OPEN";
switch (CMD) {
case "CLOSED":
print("closed");
break;
case "OPEN":
print("open");
continue pending;
pending:
case "PENDING":
print("pending");
break;
default:
print("default");
}
输出:
open pending
Assert(断言)
如果条件表达式结果不满足需要,则可以使用 assert
语句俩打断代码的执行。
注意: 断言只在检查模式下运行有效,如果在生产模式 运行,则断言不会执行。
1
2
3
var name = "qfxl";
assert(name == "hello");
print("now you see me!");
assert
方法的参数可以为任何返回布尔值的表达式或者方法。 如果返回的值为 true, 断言执行通过,执行结束。 如果返回值为 false, 断言执行失败,会抛出一个异常 AssertionError
。
Exceptions
抛出一个异常
1
throw new FormatException("msg is null");
或者
1
throw "msg is null";
Catch
可以使用 on
或者 catch
来声明捕获语句,也可以 同时使用。使用 on
来指定异常类型,使用 catch
来 捕获异常对象。
捕获异常可以避免异常继续传递(重新抛出rethrow异常除外)
1
2
3
4
5
try {
throw new FormatException("msg is null");
} on FormatException{
print("catched a FormatException");
}
函数 catch()
可以带有一个或者两个参数, 第一个参数为抛出的异常对象, 第二个为堆栈信息 (一个 StackTrace 对象)。
1
2
3
4
5
try {
throw new FormatException("msg is null");
} on FormatException catch(e,s){
print("catched a FormatException $e $s");
}
rethrow
使用 rethrow
可以将异常重新抛出。
1
2
3
4
5
6
try {
throw new FormatException("msg is null");
} on FormatException{
print("catched a FormatException");
rethrow;
}
输出:
1
2
3
4
catched a FormatException
Unhandled exception:
FormatException: msg is null
xxx
Finally
要确保某些代码执行,不管有没有出现异常都需要执行,可以使用 一个 finally
语句来实现。如果没有 catch
语句来捕获异常, 则在执行完 finally
语句后, 异常被抛出了:
1
2
3
4
5
try {
throw new FormatException("出错了");
} finally {
print("我执行在抛出异常之前");
}
定义的 finally
语句在匹配的 catch
语句之后执行:
1
2
3
4
5
6
7
try {
throw new FormatException("出错了");
} on FormatException {
print("我捕获了一个FormatException");
} finally {
print("我执行在抛出异常之前");
}
输出:
1
2
我捕获了一个FormatException
我执行在抛出异常之前
更多Exception。