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

操作符

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

除与整除

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

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

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

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

那么result1的值为2.5。

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

相等

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

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

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

类型判定操作符

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

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

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

一个简单的例子如下:

1
2
3
4
5
6
7
8
main() {
String x = '1234';
if(x is num) {
print('1');
} else if(x is String) {
print('2');
}
}

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

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

1
2
3
4
5
6
7
8
9
main() {
num x = 1234;
x as int;
if(x is int) {
print('1');
} else if(x is num) {
print('2');
}
}

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

赋值操作符

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

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

1
a ??= value;

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

条件表达式

Dart中有两种条件表达式:

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

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

级联操作符

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

正常的代码写法如下:

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

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

1
2
3
4
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可以打断代码的执行,示例代码如下:

1
assert(x < 10);

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

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

异常

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

Throw

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

1
throw 'x should be less than 10';

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

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

Catch

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

1
2
3
4
5
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}

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

1
2
3
4
5
try {
//...
} on Exception catch (e) {
print('Unknown exception: $e');
}

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

1
2
3
4
5
try {
//...
} catch (e) {
print('Unknown exception: $e');
}

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

1
2
3
4
5
6
7
  ...
} 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块中的代码都会执行。

文章作者: Kevin Wu
文章链接: https://kevinwu.cn/p/5bc19bbc/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KevinWu.CN
支付宝打赏