控制流程语句
你可以通过以下方法控制代码流程
- if和else
- for循环
- while和do-while循环
- break和continue
- switch和case
- assert
你也可以使用try-catch和throw处理异常
if和else
dart支持if语句和可选的else语句,简单的if语句可以用条件运算符( ? : ),下面是例子
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
for循环
你可以使用for循环进行迭代
var message = new StringBuffer("Dart is fun");
for (var i = 0; i < 5; i++) {
message.write('!');
}
如果对象是一个iteration对象,你可以使用forEach()方法
candidates.forEach((candidate) => candidate.interview());
iteration类List和Set使用for-in的形式
var collection = [0, 1, 2];
for (var x in collection) {
print(x);
}
while和do-while
while循环先判断条件再进入循环
while (!isDone()) {
doSomething();
}
do-while先进入循环再判断条件
do {
printLine();
} while (!atEndOfPage());
break和continue
使用break停止循环
while (true) {
if (shutDownRequested()) break;
processIncomingRequest();
}
使用continue跳过本次循环
for (int i = 0;i < candidates.length;i++) {
var candidate = candidates[i];
if (candidate.yearsExperince < 5) {
continue;
}
candidate.interview();
}
switch和case
switch通常用于整数、字符串和编译时常量的比较,比较的对象必须是同一类的实例,而不是任何子类型,每一个case必须用break结束。
在没有case匹配的情况下执行default的内容
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'PENDING':
executePending();
break;
case 'APPROVED':
executeApproved();
break;
case 'DENIED':
executeDenied();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}
下面例子中的case省略了break,因此产生了一个错误
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
//错误:缺少break导致异常!
case 'CLOSED':
executeClosed();
break;
}
然而,在case内容为空的情况下支持落空
var command = 'CLOSED';
switch (command) {
case 'CLOSED':
case 'NOW_CLOSED':
executeNowClosed();
break;
}
如果你真的希望落空,你可以使用continue继续执行
var command = 'CLOSED';
switch (command) {
case 'CLOSED':
executeClosed();
continue nowClosed;
nowClosed:
case 'NOW_CLOSED':
executeNowClosed();
break;
}
assert
使用assert语句,如果布尔值为false就扰乱正常运行,只在检查模式下工作
//确保变量非空
assert(text != null);
//确保值小于100
assert(number < 100);
//确保这是一个https URL
assert(urlString.startsWith('https'));
异常处理
dart会抛出并捕获异常,异常表示一些意想不到的事情发生了,如果没有捕获异常,就会中断运行或程序结束,与java不同,dart的所有异常都是未经检查的,dart提供了Exception和Error类型,以及众多预定义的子类型,你也可以自己定义异常
throw
这是个抛出异常的例子
throw new FormatException('Expected at least 1 section');
你还可以抛出任意对象
throw 'Out of llamas!';
因为抛出异常是一个表达式,你可以用 => statements 在任何地方抛出异常
distanceTo(Point other) => throw new UnimplementedError();
catch
捕捉或捕获异常阻止异常继续运行,捕获异常并处理
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
代码可以有多个类型的异常处理,你可以指定多个异常处理,第一个catch子句处理异常对象的类型,如果catch子句没有指定异常类型,就处理所有异常类型
try {
breedMoreLlamas();
} on OutOfLlamasException {
//指定的异常
buyMoreLlamas();
} on Exception catch (e) {
//所有异常
print('Unknown exception: $e');
} catch (e) {
//没有指定类型,处理所有异常
print('Something really unknown: $e');
}
看上面的代码,你可以使用on和catch或两者都用,使用on指定异常类型,使用catch给异常处理程序一个异常对象
finally
确保代码的运行,不管是否抛出异常,使用finally子句,无论是否有匹配异常的catch子句,最终都执行finally子句
try {
breedMoreLlamas();
} finally {
//总是执行,即使抛出异常
cleanLiamaStalls();
}
匹配任何异常catch子句后运行finally子句
try {
breedMoreLlamas();
} catch(e) {
//首先处理异常
print('Error: $e');
} finally {
//然后执行
cleanLiamaStalls();
}