iT邦幫忙

1

Dart 語言入門 4: 流程控制

if else

if else 的條件值必須是布林,不能是其他的型態, else 是選項。

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

for 循環

標準寫法

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

forEach

如果不需要用到索引值,且需要疊代出每一個值,forEach是一個很好的方法。

List numbers = [1,2,3,4,5,6,7,8,9,10];
numbers.foreach((number)=> print(number));

for in

功能跟forEach 一樣,可以疊代出每個值。

List numbers = [1,2,3,4,5,6,7,8,9,10];
for(var number in numbers){
print(number);
}

While

while

再循環之前先判斷條件

void main() {  
  var i = 7;
  while (i < 10) {
    print(i);  //7,8,9
    i++;
  }
}

do-while

do-while循環是先執行循環內的程式碼再去判斷條件

void main() {
  var i = 0;
  do {
    i++;
    print(i);    //1,2,3
  } while (i < 3);
}

Break 和 Continue

break: 中斷循環

void main() {
  var x = 5;
  while (true) {
    if (x > 7) break;
    print(x++);     //5,6,7
  }
}

continue: 跳過本次循環直接進入下一次循環

void main() {
  var x = 5;
  while (x < 10) {
    x++;
    if (x < 7) {
      continue;
    } else {
      print(x);   //7,8,9,10
    }
  }
}

Switch 和 Case

  1. 支援空的case,也就是fall-through的形式。非空的case,若要使用fall-through 可以使用 continue 以及 Label 配合使用。
  2. 非空的case,就一定要有break 不然會發生錯誤。
  3. 當完全沒有配對成功,則會執行default區段。
  4. case 區域內可以設定區域變數,該變數僅能於該case區域使用。
void main() {
  var test = 'o';
  switch (test) {
    case 'w':             // 空case fall-through 形式      
    case 'x': 
      print('case2');     //w,x
      break;
    case 'y':
      print('case3');     //y 
      continue label1;    //非空case,使用continue會直接跳到label1的位置繼續執行
    case 'z':
      print('case4');     //z
      break;
    label1:               //設定標籤 label1
    case 'a':
      print('case5');     //a, y
      break;     
    case 'b':
      print('case6');     //b
      break;
    default:
      print('case7');    //非以上的字元皆會執行
  }
}

assert 判定

assert 的第一個參數可以是值為布林值的expr。如果expr的值為 true,則判定成功,繼續執行。如果表達式的值為 false,則判定失敗,拋出一個 AssertionError 異常,會發生中斷,因此可以使用assert來中斷正常執行流程。第二個參數可以為其增加一個字串的訊息。
在生成程式(production code)中,assert 不會被執行,只有在測試模式中會被執行。

assert(urlString.startsWith('https'),
    'URL ($urlString) should start with "https".');

異常處理(Exceptions)

異常表示發生了意外的錯誤,若沒有捕獲,程式將被終止。
常見的異常有 FormatException格式異常、HttpException網絡異常、FileSystemException操作文件的異常、IntegerDivisionByZeroException整數除以0的異常。

try

用於包含可能出現異常的程式碼。

Throw

用於拋出異常。

Catch

用於捕獲異常,可以防止異常繼續傳遞。除非使用了rethrow 會將捕獲的異常再次拋出。

on

用於捕獲指定的異常型態,如 DeferredLoadException,FormatException,IntegerDivisionByZeroException,IOException,IsolateSpawnException,OSError,TimeoutException...等等,可與 catch同时使用。

finally

要確保程式碼能夠執行,無論是否有捕獲到異常,皆會執行finally的區段程式。
使用方式如下:

void main() {
  try {
    testThrow();
  } on FormatException catch (e) { //指定的Exception
    print('Exception :\n $e');
  } on Exception catch(e){         //其它的Exception
    print('Some other Exception');
  } catch (e, s) {                 //未知的Exception
    print('Exception details:\n $e');
    print('Stack trace:\n $s');
  } finally {
    print("final");
  }
}

void testThrow() {
  throw Exception('myException');
}

https://ithelp.ithome.com.tw/upload/images/20200831/20121852Jg5mPxKAPa.png
除以零的例子如下:

void main() {
  var zero = 0;
  var x = 5;
  try {
    var y = x ~/ zero;
    print('y = $y');
    testThrow();
  } on IntegerDivisionByZeroException catch (e) {
    print('除以0異常:$e');
  } catch (e, s) {
    print('Exception details:\n $e');
    print('Stack trace:\n $s');
  } finally {
    print("final");
  }
}

void testThrow() {
  throw Exception('myException');
}

https://ithelp.ithome.com.tw/upload/images/20200831/201218524FwlEiR8uy.png


尚未有邦友留言

立即登入留言