/*** 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中,初始化的顺序如下:
- 执行initializer list;
- 执行父类的构造器;
- 执行子类的构造器 。
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); //调用上面的构造器
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PHP 安全问题入门:10 个常见安全问题 + 实例讲解
- 混元太极拳入门须知及修炼纲要
- hacker入门方向
- 买8折奔驰还是9折的奥迪?豪华入门级车型怎么选
- macOS 10.15 新手入门,使用技巧分享
- 黑客入门利器,dvwa文件上传漏洞,带你进入黑客大门
- mysql入门级,20分钟搞定
- IP地址基础入门知识
- 最经典的黑客技术入门知识大全
- GNOME Linux 桌面入门