Dart 语言基础入门篇( 四 )


/*** Synchronously read the entire file contents as a list of bytes.** Throws a [FileSystemException] if the operation fails.*/Uint8List readAsBytesSync();抛出异常throw FormatException('Expected at least 1 section');throw除了可以抛出异常对象,它还可以抛出任意类型对象,但建议还是使用标准的异常类作为最佳实践 。
throw 'Out of llamas!';捕获异常可以通过on 关键词来指定异常类型:
var file = File("1.txt");try{file.readAsStringSync();} on FileSystemException {//do something}使用catch关键词获取异常对象,catch有两个参数,第一个是异常对象,第二个是错误堆栈 。
try{file.readAsStringSync();} on FileSystemException catch (e){print('exception: $e');} catch(e, s){ //其余类型print('Exception details:n $e');print('Stack trace:n $s');}使用rethrow 抛给上一级处理:
try{file.readAsStringSync();} on FileSystemException catch (e){print('exception: $e');} catch(e){rethrow;}finallyfinally一般用于释放资源等一些操作,它表示最后一定会执行的意思,即便try...catch中有return,它里面的代码也会承诺执行 。
try{print('hello');return;} catch(e){rethrow;} finally{print('finally');}输出:
hellofinally类Dart 是一门面向对象的编程语言,所有对象都是某个类的实例,所有类继承了Object类 。
一个简单的类:
class Point {num x, y;// 构造器Point(this.x, this.y);// 实例方法num distanceTo(Point other) {var dx = x - other.x;var dy = y - other.y;return sqrt(dx * dx + dy * dy);}}类成员Dart 通过. 来调用类成员变量和方法的 。
//创建对象,new 关键字可以省略var p = Point(2, 2);// Set the value of the instance variable y.p.y = 3;// Get the value of y.assert(p.y == 3);// Invoke distanceTo() on p.num distance = p.distanceTo(Point(4, 4));你还可以通过.?来避免null对象 。在Java 里面,经常需要大量的空判断来避免NullPonterException,这是让人诟病Java的其中一个地方 。而在Dart中,可以很方便地避免这个问题:
// If p is non-null, set its y value to 4.p?.y = 4;在 Dart 中,没有private、protected、public这些关键词,如果要声明一个变量是私有的,则在变量名前添加下划线_,声明了私有的变量,只在本类库中可见 。
class Point{num _x;num _y;}构造器(Constructor)如果没有声明构造器,Dart 会给类生成一个默认的无参构造器,声明一个带参数的构造器,你可以像 Java这样:
class Person{String name;int sex;Person(String name, int sex){this.name = name;this.sex = sex;}}也可以使用简化版:
Person(this.name, this.sex);或者命名式构造器:
Person.badGirl(){this.name = 'Bad Girl';this.sex = 1;}你还可以通过factory关键词来创建实例:
Person.goodGirl(){ this.name = 'good Girl'; this.sex = 1;}factory Person(int type){ return type == 1 ? Person.badGirl(): Person.goodGirl();}factory对应到设计模式中工厂模式的语言级实现,在 Flutter 的类库中有大量的应用,比如Map:
// 部分代码abstract class Map<K, V> {factory Map.from(Map other) = LinkedHashMap<K, V>.from;}如果一个对象的创建过程比较复杂,比如需要选择不同的子类实现或则需要缓存实例等,你就可以考虑通过这种方法 。在上面Map例子中,通过声明 factory来选择了创建子类LinkedHashMap(LinkedHashMap.from也是一个factory,里面是具体的创建过程) 。
如果你想在对象创建之前的时候还想做点什么,比如参数校验,你可以通过下面的方法:
Person(this.name, this.sex): assert(sex == 1)在构造器后面添加的一些简单操作叫做initializer list 。
在Dart中,初始化的顺序如下:

  1. 执行initializer list;
  2. 执行父类的构造器;
  3. 执行子类的构造器 。
class Person{String name;int sex;Person(this.sex): name = 'a', assert(sex == 1){this.name = 'b';print('Person');}}class Man extends Person{Man(): super(1){this.name = 'c';print('Man');}}void main(){Person person = Man();print('name : ${person.name}');}上面的代码输出为:
PersonManname : c如果子类构造器没有显式调用父类构造器,那么默认会调用父类的默认无参构造器 。显式调用父类的构造器:
Man(height): this.height = height, super(1);重定向构造器:
Man(this.height, this.age): assert(height > 0), assert(age > 0);Man.old(): this(12, 60); //调用上面的构造器


推荐阅读