if-else會根據條件判斷決定不同的行為,以中文舉例就是「假如今天下雨我就會開車上班,不然我就會騎機車」。
寫成程式碼形式會變成:
if (今天下雨){
開車();
}
else{
騎機車();
}
判斷條件也可以超過兩個以上,這時就需要使用else if
void main() {
var a = 5;
if (a > 10) {
print("a大於10");
}
else if (a <= 10 && a >= 0) {
print("a介於0到10之間");
}
else {
print("a小於0");
}
}
if-else判斷式還有一個簡潔的寫法叫做三元運算子(Ternary),三元運算子在Flutter也經常會使用到喔。
三元運算子的語法為X = Condition ? A : B;
翻譯成中文就是,若Condition為true,X = A
若Condition為false,X = B
註:A和B也可以代入function來使用
來看個例子:
void main() {
var age = 16;
String verify = age >= 20 ? "滿20歲擁有投票權" : "未滿20歲不能投票";
print(verify); // Output:未滿20歲不能投票
}
for loop的語法有兩種
第一種:
迴圈會以這樣的流程進行
/*
for (起始值; 條件式; 更新值) {
do something...
}
*/
void main() {
for (var i = 0; i < 10; i++) {
print("Current value is $i.");
}
// 變數i起始為0,每經過一次迴圈會+1,當i>=10時就會跳出迴圈
}
第二種:
簡單的理解就是依次取出list內的值
/*
for (變數 : 陣列){
do something...
}
*/
void main() {
var l = [1, 2, 3, 4, 5];
for (var num in l) {
print("Current value is $num");
}
}
while的語法為:
while(判斷式){
do something...
}
當while迴圈的判斷式為「true」時會重複執行迴圈內程式碼,直到判斷式變為「false」或是使用break
跳離迴圈才會停止。
void main() {
var a = 5;
while(a > 0) {
print(a);
a--; // 等同於 a = a - 1(將a-1的意思)
}
print("while迴圈結束");
//Output:5 4 3 2 1
//Output:while迴圈結束
}
上述程式碼在a > 0
時都會執行print(a)
並把a -1,直到a變成0跳出迴圈。
do-while和while非常像,唯一的差別是do-while「至少」會執行一次,而while有可能不會執行到程式。
語法為:
do {
do something...
}while(判斷式);
執行流程為:
void main() {
var i = 5;
do{
print(i);
i--;
}while(i > 0);
// Output:5 4 3 2 1
}
Switch能夠依照不同的狀態進行不同的處理,有點類似於if
但更為直觀並擁有更好的效能。
Switch的語法為:
Switch(變數) {
case 1:
do something...
break;
case 2:
do something...
break;
.
.
}
會依照變數屬於哪個case就做哪一種處理
break非常重要一定要記得加喔,不然會報錯。
void main() {
var fruit = 'apple';
switch(fruit) {
case 'banana':
print('You have a banana');
break;
case 'cherry':
print('You have a cherry');
break;
case 'durian':
print('You have a durian');
break;
case 'apple':
print('You have an apple');
break;
default: //若沒有符合的case就會執行default
print("Wow, I don't know what fruit it is.");
}
}
例外處理對於寫程式是很重要的習慣,除了方便你在開發時debug外,對於使用者體驗影響也很大,絕對不會有使用者想用到一個隨時會crash的App,因此我們在使用不穩定的操作(網路連線)或是運算(除法)時一定要記得做例外處理。
例外處理的語法為:
try {
do something...
} on 特定的Exceptions/Errors{
//遇到特定例外時執行的部分
}catch(e){
// 當你不確定可能引發的錯誤種類時可以使用catch
// 它會接收所有的錯誤訊息
}finally{
// 無論是否有遇到錯誤都會執行到的部分
}
舉一個常見的例子:
void main(){
int a = 10;
int b = 0;
var result = null;
try{
result = divide(a, b);
}on IntegerDivisionByZeroException{
print("除數不能為0");
}catch(e){
print(e);
}finally{
print(result);
}
}
double divide(int a, int b) {
if(b == 0) {
//引發Exception
throw new IntegerDivisionByZeroException();
}
return a / b;
}
可以從結果得知由於執行divide
引發了Exception,而觸發執行on IntegerDivisionByZeroException
內程式碼最後執行finally
內程式碼。
你也可以嘗試把on IntegerDivisionByZeroException{...}
這部分刪掉看看效果如何
提供官方文件列出的Exception和Error網址供參考,基本上各種情況都有相對應的可以選擇,當然也可以根據情況客製化自己的Exception。
今天介紹了流程控制以及例外處理,大家一定要熟悉如何使用它們,它們對於程式的執行可是有舉足輕重的地位,一個不小心出錯程式可能就出bug或是崩潰囉。
明天是介紹Dart的最後一天,會以介紹「class」和「async」的概念為主,大家明天見。