拋出異常的例子bash
void test(){
throw FormatException('拋出一個 FormatException 異常 ');
}
複製代碼
也能夠拋出任意對象函數
throw `數據非法`;
複製代碼
你能夠指定一個或多個參數捕獲異常(catch),第一個是拋出的異常,第二個是堆棧跟蹤(StackTrace對象)。以下所示:ui
void test(){
try{
//....
} on Exception catch(e){
print('Exception details:\n $e');
}catch(e,s){
print('Exception details:\n $e');
print('Stack trace:\n $s ');
}
}
複製代碼
上面代碼第一個catch用來捕獲異常詳細信息,第二個catch是堆棧跟蹤信息。this
Finally
和其餘的語言的finally
效果同樣的。代碼示例以下spa
void test(){
try{
//....
} on Exception catch(e){
print('Exception details:\n $e');
}catch(e,s){
print('Exception details:\n $e');
print('Stack trace:\n $s ');
} finally {
print('Do some thing:\n');
}
}
複製代碼
不管如何都會走到finally
塊中。.net
Dart做爲高級語言支持面向對象的不少特性,而且支持基於mixin
繼承方式。基於mixin
的繼承方式是指:一個類能夠繼承多個父類,至關於其餘語言的多繼承。全部的類都有同一個基類Object
,這個特性相似於Java
語言,Java全部的類也都是繼承自Object,也就是說一切皆對象。 使用new
語句實例化一個類,以下所示:code
//實例化一個User類的對象user
var user = new User('jack','20');
複製代碼
定義一個User類,在裏面添加成員變量name
和age
,以下:orm
class User{
String name;
int age;
}
複製代碼
類定義中全部的變量都會隱式的定義setter
方法,針對非空的變量會額外增長getter
方法。實例化User
以下:對象
main() {
var user = User();
user.name='jack';//至關於使用了name的setter方法
user.age=20;
}
複製代碼
代碼以下:blog
class User{
String name;
int age;
User(String name,int age){
this.name=name;
this.age=age;
}
}
複製代碼
也能夠簡寫
class User{
String name;
int age;
User(this.name,this.age);
}
複製代碼
使用命名構造函數從另外一類或現有的數據中快速實現構造函數,以下:
class User{
String name;
int age;
User(this.name,this.age);
//命名構造函數
User.fromJson(Map map){
name = map['name'];
age = map['age'];
}
}
複製代碼
除了調用父類的構造函數,也能夠經過初始化列表在子類的構造函數運行前來初始化實例成員變量值,代碼以下:
class User{
final String name;
final int age;
User(name,age)
:name=name,
age=age;
}
main(){
var u = User('cxl',21);
}
複製代碼
get()
和set()
get()
和set()
是專門用於讀取和寫入對象的屬性方法,每一類的實例,系統都會隱式地包含有get()
和set()
方法。 例如,定義一個矩形地類,有上、下、左、右四個成員變量:top
、bottom
、left
、right
,使用get
及set
關鍵字分別對right
及bottom
進行獲取和設置值。以下
class Rectangle{
num left;
num top;
num width;
num height;
Rectangle(this.left,this.top,this.width,this.height);
//獲取right值
num get right => left + width;
//設置right值地時候 同時left也要發生變化
set right(num value) => left = value-width;
//獲取bottom值
num get bottom => top + height;
//設置bottom值 同時top也要變化
set bottom(num value)=>top = value - height;
}
main(){
var rect = Rectangle(3,4,20,15);
print('left:${rect.left}');
print('right:${rect.right}');
rect.right=30;
print('修改 right 值爲 30');
print('left:${rect.left}');
print('right:${rect.right}');
print('-------------------------------');
print('top:${rect.top}');
print('bottom:${rect.bottom}');
rect.bottom=50;
print('修改 bottom 值爲 50');
print('top:${rect.top}');
print('bottom:${rect.bottom}');
}
複製代碼
上面例子對應輸出爲:
left:3
right:23
修改 right 值爲 30
left:10
right:30
-------------------------------
top:4
bottom:19
修改 bottom 值爲 50
top:35
bottom:50
複製代碼
編寫一個例子,定義一個Vector向量類,編寫兩個方法分別用於重載加號及減號,那麼當兩個向量相見,就表示他們的x值及y值相加,當兩個向量相減,就表示他們地x值及y值相減,以下:
//定義一個向量類
class Vector {
final int x;
final int y;
const Vector(this.x,this.y);
//重載加號 + (a+b)
Vector operator +(Vector v){
return new Vector(x+v.x, y+v.y);
}
//重載減號- (a -b)
Vector operator - (Vector v){
return new Vector(x-v.x, y-v.y);
}
}
main(){
//實例化兩個向量
final v = Vector(2,3);
final w = Vector(2,2);
final r1=v+w;
print('r1.x=${r1.x}\tr1.y=${r1.y}');
final r2 = v - w ;
print('r2.x=${r2.x}\tr2.y=${r2.y}');
}
複製代碼
上面例子輸出爲:
r1.x=4 r1.y=5
r2.x=0 r2.y=1
複製代碼
Dart中的繼承、抽象、枚舉基本和Java一致嗎,沒啥好說的。
Mixins(混入功能)至關於多繼承,也就是說能夠繼承多個類。 具體能夠參考這篇文章:HelloDart-MixIn,土話記錄多繼承機制
下面是個Mixins
的小例子:
class S{
a() => print('S.a');
}
class A{
a()=>print('A.a');
b()=>print('A.b');
}
class T = A with S; main(){
var t = T();
t.a();
t.b();
}
複製代碼
以上代碼輸出以下:
S.a
A.b
複製代碼