Dart 语言简易教程(五)

Dart 语言简易教程(一): http://www.jianshu.com/p/8a62b1a2fd75
Dart 语言简易教程(二): http://www.jianshu.com/p/b2153a32dd8b
Dart 语言简易教程(三): http://www.jianshu.com/p/6d2495a0d3d7
Dart 语言简易教程(四): http://www.jianshu.com/p/fdd046a6dc82

Dart 语言简易教程(五)

流程控制语句

Dart 可用的流程控制语句:

  • if and else
  • for loops
  • while and do-while loops
  • break and continue
  • switch and case
  • assert
  • try-catch and throw

if and else

Dart 支持ifelse的多种组合。
和Python,Java,C++ 都有类似的操作。

例子:

if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

如前面的教程里面提到的那样,Dart 中只有变量值为true 的时候才会返回true 的结果。

for 循环

for 循环的例子:

var message = new StringBuffer("Dart is fun");
for (var i = 0; i < 5; i++) {
  message.write('!');
}

除了常规的for 循环外,针对可以序列化的操作数,可以使用forEach() 方法。
当不关心操作数的当前的下标的时候,forEach()方法是很简便的。
例子:

var collection = [0, 1, 2];
for (var x in collection) {
  print(x);
}

While and do-while

while 循环的例子:

main() {
  var _temp = 0;
  while(_temp < 5){

    print("this is loop: " + (_temp).toString());
    _temp ++;
  }
}

do-while 循环的例子:

main() {
  var _temp = 0;

  do{
    print("this is loop: " + (_temp).toString());
    _temp ++;
  }
  while(_temp < 5);
}

上面的两个例子都对应如下输出:

this is loop: 0
this is loop: 1
this is loop: 2
this is loop: 3
this is loop: 4

Break 和 continue

break 用来跳出循环

while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

continue 用来跳过本次循环

for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

Switch 和 case

Dart 中switch / case 语句使用== 操作来比较整数,字符串或其它编译过程中的常量,从而实现分支的作用。
switch / case 语句的前后操作数必须是相同的类型的对象实例(即使其中一个操作数属于另一个对象的子类的实例,比较操作也不行。)

每一个非空的case 子句(不是case 判断语句本身,而是case 语句下面的实际操作。)最后都必须跟上break 语句。

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    // ERROR: Missing break causes an exception!!

  case 'CLOSED':
    executeClosed();
    break;
}
var command = 'CLOSED';
switch (command) {
  case 'CLOSED': // Empty case falls through.
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

使用switch / case 语句,配合 continue 语句。可以实现类似 goto 语句的功能。

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
    // Continues executing at the nowClosed label.

nowClosed:
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

断言(assert)

Dart 语言通过使用assert 语句来中断正常的执行流程,中断的前提是:assert 判断的条件为 false 。

// Make sure the variable has a non-null value.
assert(text != null);

assert 判断的条件可以是任何可以转化为 boolean 类型的对象,即使是函数也可以(此时判断的是函数返回值)。

如果assert 的判断为true, 则继续执行下面的语句。反之则会丢出一个异 AssertionError 。

异常(Exceptions)

Dart 代码可以丢出或捕获异常。
异常表明发生了一些不预期的错误。
如果不捕获异常,一旦异常发生,则程序和中断执行并停止运行。

Dart 代码不会在代码中指定代码将会丢出什么异常,所以调用系统代码时,不会强制要求处理异常。这点与Java 的处理方式是不同的。

Dart 提供 Exception 和 Error 类型来处理异常。自己也可以定义属于自己的异常类型。

Throw

用于抛出异常。

throw new FormatException('Expected at least 1 section');

也可以通过throw 语句释放任意的类型:

throw 'Out of llamas!';

因为抛出异常属于表达式,可以将throw 语句放置在 =>语句中:

distanceTo(Point other) =>
    throw new UnimplementedError();

捕获(Catch)

基本用法与Python 相同。
将可能出现异常的代码放置到try 语句中,然后在气候跟上 catch 语句来处理可能出现的异常。
可以通过 on语句来指定需要捕获的异常类型,使用catch 来处理异常。

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}

可以向catch()传递1个或2个参数。第一个参数表示:捕获的异常的具体信息,第二个参数表示:异常的堆栈跟踪(stack trace)。

  ...
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}

rethrow语句用来处理一个异常,同时希望这个异常能够被其它调用的部分使用。
如下的代码:

final foo = '';

void misbehave() {
  try {
    foo = "You can't change a final variable's value.";
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // Allow callers to see the exception.
  }
}

void main() {
  try {
    misbehave();
  } catch (e) {
    print('main() finished handling ${e.runtimeType}.');
  }
}

Finally

Dart 的finally用来执行那些无论异常是否发生都执行的操作。

try {
  breedMoreLlamas();
} catch(e) {
  print('Error: $e');  // Handle the exception first.
} finally {
  cleanLlamaStalls();  // Then clean up.
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容