Flutter基础:Dart编程语言——操作符、流程控制和异常

操作符

Dart的操作符与其它语言大同小异,这里不做一一介绍,只挑出几个需要注意的来解释下。

除与整除

在“除”这件事上,Dart涉及到两个操作符,分别如下:

操作符 说明
/ 除号
~/ 除号,但是返回值为整数

上面表格已经可以大致反映了两种“除”的区别,其中/与大多数客户端和后端语言不同,他不是整除的,如下所示代码中:

var result1 = 5 / 2;
var result2 = 5 ~/ 2;

那么result1的值为2.5。

而~/才代表整除,所以reuslt2的值为2。

相等

Dart里面相等的操作符是==。

这里的==在两个对象代表同样内容的时候返回true。

如果要判断两个对象是否是同一个对象,则要使用identical()方法。

类型判定操作符

as、is和is!操作符是在运行时判定对象类型的操作符,下面表格是对这三种操作符的说明:

操作符 说明
as 类型转换
is 如果对象时指定类型则返回True
is! 如果对象时指定的类型返回False

只有当obj实现了T的接口,obj is T才是true。例如obj is Object总是true。

一个简单的例子如下:

main() {
  String x = '1234';
  if(x is num) {
    print('1');
  } else if(x is String) {
    print('2');
  }
}

运行结果是在控制台输出了2。
is!的作用相反,这里就不举例子了。

而as操作符是将对象转换为指定的类型,将上面代码稍作修改就可以知道这个操作符的作用:

main() {
  num x = 1234;
  x as int;
  if(x is int) {
    print('1');
  } else if(x is num) {
    print('2');
  }
}

运行的结果就是控制台输出了1。

赋值操作符

=这个赋值操作符是最基本的赋值操作符,但Dart里面还有一个??=的赋值操作符。

这个赋值操作符的意义以一个简单的例子说明:

a ??= value;

上述例子中,如果a为null,则赋值value给a,如果a不为null,则a保持不变。

条件表达式

Dart中有两种条件表达式:

第一中也是其他语言常见的:condition ? expr1 : expr2

而第二种,是:expr1 ?? expr2(如果expr1是non-null,返回其值;否则执行expr2并返回其结果。)

级联操作符

级联操作符(..)可以在同一个对象上连续调用多个方法或访问成员变量,可以使用官方文档的一个例子来说明。

正常的代码写法如下:

var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

而使用级联操作符写法如下:

querySelector('#button') // Get an object.
  ..text = 'Confirm'   // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

注意:严格来说, 两个点的级联语法不是一个操作符。 只是一个 Dart 特殊语法。

其他操作符

这里补充一个?.操作符的说明:

?.操作符为条件成员访问操作符,和成员访问操作符.类似,但左边的操作对象不能为null。如果左边的操作对象为null则返回null,否则返回右边的成员。

流程控制语句

Dart的流程控制语句有以下几种:

  • if-else
  • for循环
  • while、do-while循环
  • break和continue
  • switch和case
  • assert
    除了assert比较少用,其他的基本和别的语言一致,这里就不细说了。
断言

断言assert可以打断代码的执行,示例代码如下:

assert(x < 10);

如果x小于10,则不会发生任何事情,但如果x大于10,断言会执行失败,会抛出一个异常AssertionError。

需要注意的是,断言只会在debug模式下生效,release模式是不会执行的。

异常

异常的写法和作用和其他语言基本是一致的,但和java不同的是,所有Dart异常都是费检查异常。
方法不一定声明了他们所抛出的异常,并且不要求你捕获任何异常。
Dart提供Exception和Error类型,和一些基于这两种类型的子类,或者你可以定义自己的异常类型。但是,Dart并不要求只能抛出这两种类型或其子类的异常,而是可以抛出任何非null的对象作为异常。

Throw

下面是一个简单的对象异常抛出示例:

throw 'x should be less than 10';

或者使用系统定义的异常:

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

捕获异常和其他语言类似,但写法稍有不同,以下为官方文档示例:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

前面提到Dart提供Exception类,如果你能确定将要捕获的异常为Exception类或者他的子类,你就可以这么来写:

try {
 //...
} on Exception catch (e) {
  print('Unknown exception: $e');
}

或者你可以捕获所有类型异常:

try {
 //...
} catch (e) {
  print('Unknown exception: $e');
}

需要注意的是catch()可以带有一个或者两个参数,第一个参数为抛出的异常对象,第二个为堆栈信息:

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

另外,还可以使用rethrow关键字重新抛出异常,但这个我个人建议一般情况下不要使用。

Finally

这个和java中的finally的意义是一样的,不管会不会抛出异常,finally块中的代码都会执行。

本文摘抄自KevinWu的博客

你可能感兴趣的:(Flutter基础:Dart编程语言——操作符、流程控制和异常)