if else
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('!');}
forEach
如果不需要用到索引值,且需要叠代出每一个值,forEach是一个很好的方法。
List numbers = [1,2,3,4,5,6,7,8,9,10];numbers.foreach((number)=> print(number));
for in
功能跟forEach 一样,可以叠代出每个值。
List numbers = [1,2,3,4,5,6,7,8,9,10];for(var number in numbers){print(number);}
While
while
再循环之前先判断条件
void main() { var i = 7; while (i < 10) { print(i); //7,8,9 i++; }}
do-while
do-while循环是先执行循环内的程式码再去判断条件
void main() { var i = 0; do { i++; print(i); //1,2,3 } while (i < 3);}
Break 和 Continue
break: 中断循环
void main() { var x = 5; while (true) { if (x > 7) break; print(x++); //5,6,7 }}
continue: 跳过本次循环直接进入下一次循环
void main() { var x = 5; while (x < 10) { x++; if (x < 7) { continue; } else { print(x); //7,8,9,10 } }}
Switch 和 Case
支援空的case,也就是fall-through的形式。非空的case,若要使用fall-through 可以使用 continue 以及 Label 配合使用。非空的case,就一定要有break 不然会发生错误。当完全没有配对成功,则会执行default区段。case 区域内可以设定区域变数,该变数仅能于该case区域使用。void main() { var test = 'o'; switch (test) { case 'w': // 空case fall-through 形式 case 'x': print('case2'); //w,x break; case 'y': print('case3'); //y continue label1; //非空case,使用continue会直接跳到label1的位置继续执行 case 'z': print('case4'); //z break; label1: //设定标籤 label1 case 'a': print('case5'); //a, y break; case 'b': print('case6'); //b break; default: print('case7'); //非以上的字元皆会执行 }}
assert 判定
assert 的第一个参数可以是值为布林值的expr。如果expr的值为 true,则判定成功,继续执行。如果表达式的值为 false,则判定失败,抛出一个 AssertionError 异常,会发生中断,因此可以使用assert来中断正常执行流程。第二个参数可以为其增加一个字串的讯息。
在生成程式(production code)中,assert 不会被执行,只有在测试模式中会被执行。
assert(urlString.startsWith('https'), 'URL ($urlString) should start with "https".');
异常处理(Exceptions)
异常表示发生了意外的错误,若没有捕获,程式将被终止。
常见的异常有 FormatException格式异常、HttpException网络异常、FileSystemException操作文件的异常、IntegerDivisionByZeroException整数除以0的异常。
try
用于包含可能出现异常的程式码。
Throw
用于抛出异常。
Catch
用于捕获异常,可以防止异常继续传递。除非使用了rethrow 会将捕获的异常再次抛出。
on
用于捕获指定的异常型态,如 DeferredLoadException,FormatException,IntegerDivisionByZeroException,IOException,IsolateSpawnException,OSError,TimeoutException...等等,可与 catch同时使用。
finally
要确保程式码能够执行,无论是否有捕获到异常,皆会执行finally的区段程式。
使用方式如下:
void main() { try { testThrow(); } on FormatException catch (e) { //指定的Exception print('Exception :\n $e'); } on Exception catch(e){ //其它的Exception print('Some other Exception'); } catch (e, s) { //未知的Exception print('Exception details:\n $e'); print('Stack trace:\n $s'); } finally { print("final"); }}void testThrow() { throw Exception('myException');}
除以零的例子如下:
void main() { var zero = 0; var x = 5; try { var y = x ~/ zero; print('y = $y'); testThrow(); } on IntegerDivisionByZeroException catch (e) { print('除以0异常:$e'); } catch (e, s) { print('Exception details:\n $e'); print('Stack trace:\n $s'); } finally { print("final"); }}void testThrow() { throw Exception('myException');}