Flutter开发指南之理论篇:Dart语法02(运算符,循环,异常)

总目录

Flutter开发指南之理论篇:Dart语法01(数据类型,变量,函数)
Flutter开发指南之理论篇:Dart语法02(运算符,循环,异常)
Flutter开发指南之理论篇:Dart语法03(类,泛型)
Flutter开发指南之理论篇:Dart语法04(库,异步,正则表达式)


 Dart是一门面向对象语言,它针对web 和移动设备开发进行了优化,主要特点为:

  • 一切皆对象!无论是数字,函数还是null,所有对象继承自Object类;
  • 声明一个变量时可以不指定具体类型,Dart可以自动推断类型;
  • Dart支持顶层函数,函数是一等对象,且函数可作为参数传递;
  • Dart使用_开头表示私有属性,没有关键字publicprotectedprivate

1. 运算符

类型运算符说明
算术运算符+  -  *  /  ~/  %  ++  –其中,/结果是浮点型,~/结果是整型,%求余
关系运算符==  !=  >  <  >=  <= 
类型判断运算符as  is  is!其中,as用于强制类型转换,is判断对象类型,is!作用与is相反
赋值运算符??=  =  -=  /=  %=  >>=  ^=等复合运算其中,??=只有被赋值的变量为null才会成功,否则保持不变
逻辑运算符!  ||  &&
位运算符&  |  ^  ~  <<  << 其中,~表示按位取反
条件表达式condition ? expr1 : expr2 , expr1 ?? expr2其中,??表示expri1非空返回expri1,否则返回expri2
其他运算符() [] .其中,()表示函数调用,[]访问列表元素,.访问对象成员(属性和方法))

 除了上述常见的运算符,dart中还提供了两个特殊的运算符:..(级联运算符)和?.

  • 级联运算符(..)

 级联运算符 (…) 可以实现对同一个对像进行一系列的操作。除了调用函数,还可以访问同一对象上的字段属性。

querySelector('#confirm') // 获取对象。
  ..text = 'Confirm' // 调用成员变量。
  ..classes.add('important') // 调用成员方法
  ..onClick.listen((e) => window.alert('Confirmed!'));
  
// 等价于
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed

// 级联运算
// 嵌套操作
final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

注意:在返回对象的函数中谨慎使用级联操作符。

  • 访问对象成员运算符(?.)

 相比于访问对象成员运算.,(?.)允许对象为null,能够有效避免NullPointException异常。

var button = querySelector('#confirm');
// 如果button=null,会调用失败,不会报NPE异常
button?.text = 'Confirm'; 

2. 控制流程语句

2.1 if和else

 Dart支持if - else语句,其中else是可选的。

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

2.2 for循环

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

 如果要迭代一个实现了Iterable接口的对象,比如List/Set,可以使用forEach()for-in

  • forEach使用
var callbacks = [];
// 向列表添加0,1
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
// 输出0,1
callbacks.forEach((c) => c());
  • for-in使用
var collection = [0, 1, 2];
for (var x in collection) {
  print(x); // 0 1 2
}

2.3 while和do…while

// while循环
// 先判断,再执行
while (!isDone()) {
  doSomething();
}

// do...while循环
// 先执行,再判断
do {
  doSomething();
} while (!isDone());

2.4 switch…case

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
}

 在case语句中,每个非空的 case 语句结尾需要跟一个break语句。除 break以外,还有可以使用continue, throw,者return。当然,Dart支持空case语句,允许程序以fall-through的形式执行。

var command = 'OPEN';
switch (command) {
  // ‘CLOSED’和'OPEN'只要匹配上其中的一个
  // 便可执行executeOpen
  case 'CLOSED':
  case 'OPEN':
    executeOpen();
    break;
}

 上述fall-through代码等价于:

var command = 'OPEN';
switch (command) {
  // 如果匹配的是'CLOSED'
  // executeClosed和executeOpen均会被执行
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
    
  nowClosed:
  case 'OPEN':
    executeOpen();
    break;
}

无论是for/while/do…while,还是switch…case,均可使用contiuebreak操作控制流程,前者用于跳转到下一次迭代,后者用于停止循环。

3. 异常处理

 和Java不同,Dart中所有的异常都是非检查异常,即在Dart中的方法不会声明它们抛出的异常,也不要求调用者必须捕获任何异常。Dart提供了ExceptionError类型异常,包括它们的子类,实际上,Dart语言允许抛出任何非null对象,不仅限于Exception和Error对象。

3.1 throw

 Dart中使用throw抛出一个异常或者任何非null对象。

// 抛出异常
void test() {
    ...
    throw FormatException('format incurrent');
}

// 抛出任何对象
// 这里抛出一个String对象
throw "Hell World"

3.2 try…catch…finally

 和java一样,Dart也是使用try...catch...finally来捕获异常,而关键字on用于指定具体的类型。

// 处理指定类型的异常
try {
    test()
} on FormatException catch (e) {
    handleFormatException()
}

// 其中,catch可以省略
// 上述代码等价于
try {
    test()
} on FormatException {
    handleFormatException()
}


 指定多个catch,用于捕获处理可能抛出的多种类型异常。

try {
    test()
} on FormatException {
    // 捕获具体类型的异常
    handleFormatException()
} catch(e) {
    // 没有指定具体类型,捕获所有异常
    handleUnkown()
}

 另外,catch()函数可以指定1到2个参数,第一个参数为抛出的异常对象,第二个为堆栈信息 (一个StackTrace对象)。

try {
  // ···
} on Exception catch (e) {
  // 处理Exception异常,及其子类
  print('Exception details:\n $e');
} catch (e, s) {
  // 处理所有抛出的对象,包括异常
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
} finally {
  // 无论catch是否执行
  // finally永远会被执行,规则如下:
  // 如果没有任何catch,执行try后,直接执行finally
  // 如果有catch,执行try后,先执行finally,再执行catch
  print('always arrived.');
}

参考文献:

1. Dart编程语言中文网

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页