Dart学习第四章

记录Dart第四章-流程控制。

Posted by XYH on May 2, 2019

记录Dart第四章-流程控制。

流程控制

本文记录Dart流程控制及异常处理。

  • if and else
  • for loops
  • while and do while loops
  • break and continue
  • switch and case
  • 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));

ListSet 等实现了 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语句使用==比较integerstring或者编译时常量,比较的对象必须时同一个类的实例,class必须没有覆盖==操作符。

每个非空的case语句必须有一个break语句,另外可以通过continuethrow或者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