Dart基础-控制流程与异常处理

控制流程语句

你可以通过以下方法控制代码流程

  • if和else
  • for循环
  • while和do-while循环
  • break和continue
  • switch和case
  • assert

你也可以使用try-catch和throw处理异常

if和else

dart支持if语句和可选的else语句,简单的if语句可以用条件运算符( ? : ),下面是例子

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

for循环

你可以使用for循环进行迭代

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

如果对象是一个iteration对象,你可以使用forEach()方法

candidates.forEach((candidate) => candidate.interview());

iteration类List和Set使用for-in的形式

var collection = [0, 1, 2];
for (var x in collection) {
  print(x);
}

while和do-while

while循环先判断条件再进入循环

while (!isDone()) {
  doSomething();
}

do-while先进入循环再判断条件

do {
  printLine();
} while (!atEndOfPage());

break和continue

使用break停止循环

while (true) {
  if (shutDownRequested()) break;
  processIncomingRequest();
}

使用continue跳过本次循环

for (int i = 0;i < candidates.length;i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperince < 5) {
    continue;
  }
  candidate.interview();
}

switch和case

switch通常用于整数、字符串和编译时常量的比较,比较的对象必须是同一类的实例,而不是任何子类型,每一个case必须用break结束。

在没有case匹配的情况下执行default的内容

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
  }

下面例子中的case省略了break,因此产生了一个错误

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    //错误:缺少break导致异常!

  case 'CLOSED':
    executeClosed();
    break;
}

然而,在case内容为空的情况下支持落空

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
  case 'NOW_CLOSED':
    executeNowClosed();
    break;
}

如果你真的希望落空,你可以使用continue继续执行

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;

nowClosed:
  case 'NOW_CLOSED':
    executeNowClosed();
    break;
}

assert

使用assert语句,如果布尔值为false就扰乱正常运行,只在检查模式下工作

//确保变量非空
assert(text != null);

//确保值小于100
assert(number < 100);

//确保这是一个https URL
assert(urlString.startsWith('https'));

异常处理

dart会抛出并捕获异常,异常表示一些意想不到的事情发生了,如果没有捕获异常,就会中断运行或程序结束,与java不同,dart的所有异常都是未经检查的,dart提供了Exception和Error类型,以及众多预定义的子类型,你也可以自己定义异常

throw

这是个抛出异常的例子

throw new FormatException('Expected at least 1 section');

你还可以抛出任意对象

throw 'Out of llamas!';

因为抛出异常是一个表达式,你可以用 => statements 在任何地方抛出异常

distanceTo(Point other) => throw new UnimplementedError();

catch

捕捉或捕获异常阻止异常继续运行,捕获异常并处理

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

代码可以有多个类型的异常处理,你可以指定多个异常处理,第一个catch子句处理异常对象的类型,如果catch子句没有指定异常类型,就处理所有异常类型

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  //指定的异常
  buyMoreLlamas();
} on Exception catch (e) {
  //所有异常
  print('Unknown exception: $e');
} catch (e) {
  //没有指定类型,处理所有异常
  print('Something really unknown: $e');
}

看上面的代码,你可以使用on和catch或两者都用,使用on指定异常类型,使用catch给异常处理程序一个异常对象

finally

确保代码的运行,不管是否抛出异常,使用finally子句,无论是否有匹配异常的catch子句,最终都执行finally子句

try {
  breedMoreLlamas();
} finally {
  //总是执行,即使抛出异常
  cleanLiamaStalls();
}

匹配任何异常catch子句后运行finally子句

try {
  breedMoreLlamas();
} catch(e) {
  //首先处理异常
  print('Error: $e');
} finally {
  //然后执行
  cleanLiamaStalls();
}
时间: 2024-12-13 05:40:35

Dart基础-控制流程与异常处理的相关文章

Java核心技术卷I基础知识3.8.6 中断控制流程语句

3.8.6 中断控制流程语句 尽管Java的设计者将goto作为保留字,但实际上并没有打算在语言中使用它.通常,使用goto语句被认为是一种拙劣的程序设计风格.当然,也有一些程序员认为反对goto的呼声似乎有些过分(例如,Donald Knuth就曾编著过一篇名为<Structured Programming with goto statements>的著名文章).这篇文章说:无限制地使用goto语句确实是导致错误的根源,但在有些情况下,偶尔使用goto跳出循环还是有益处的.Java设计者同意

Java核心技术卷I基础知识3.8 控制流程

3.8 控制流程 与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程.本节先讨论条件语句,然后讨论循 环语句,最后介绍看似有些笨重的switch语句,当需要对某个表达式的多个值进行检测时,可以使用switch 语句.       C++注释:Java的控制流程结构与C和C++的控制流程结构一样,只有很少的例外情况.没有goto语 句,但break语句可以带标签,可以利用它实现从内层循环跳出的目的(这种情况C语言采用goto语句实 现).另外,还有一种变形的for循环,在C或C++

JavaScript中使用Callback控制流程介绍

 这篇文章主要介绍了JavaScript中使用Callback控制流程介绍,本文讲解了callback的一些问题和优化后的写法并给出代码实例,需要的朋友可以参考下     javascript中随处可见的callback对于流程控制来说是一场灾难,缺点显而易见: 1.没有显式的return,容易产生多余流程,以及由此引发的bug. 2.造成代码无限嵌套,难以阅读. 下面就来说说怎么解决避免上述的问题. 第一个问题是一个习惯问题,在使用callback的时候往往会让人忘了使用return,这种情况

MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)

[正文] 一.navicat的引入:(第三方可视化的客户端,方便MySQL数据库的管理和维护) NavicatTM是一套快速.可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小企业的需要.Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建.组织.访问并共用信息. Navicat 是闻名世界.广受全球各大企业.政府机构.教育机构所信赖,更是各界从业员每天必备的工作伙伴,被公认为全球最受欢迎的MySQL前

《Android游戏开发详解》——第1章,第1.7节控制流程第1部分——if和else语句

1.7 控制流程第1部分--if和else语句 Android游戏开发详解 我们现在把注意力转向控制流程(control flow ,也称为流程控制,flow control),这指的是代码行将要按照什么样的顺序执行.还记得代码执行的基本规则吧,它是说代码要从上到下地执行.在最简单的程序中,代码真的是按照线性方式从上向下执行的.然而,在任何有用的程序中,我们可能会看到,根据某些条件,会跳过一些代码行甚至重复执行一些代码行.让我们来看一些例子. 1.7.1 if-else语句块 if-else语句

《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句

1.7 控制流程第1部分--if和else语句 Android游戏开发详解 我们现在把注意力转向控制流程(control flow ,也称为流程控制,flow control),这指的是代码行将要按照什么样的顺序执行.还记得代码执行的基本规则吧,它是说代码要从上到下地执行.在最简单的程序中,代码真的是按照线性方式从上向下执行的.然而,在任何有用的程序中,我们可能会看到,根据某些条件,会跳过一些代码行甚至重复执行一些代码行.让我们来看一些例子. 1.7.1 if-else语句块 if-else语句

《Android游戏开发详解》一1.8 控制流程第2部分——while和for循环

1.8 控制流程第2部分--while和for循环 Android游戏开发详解 在前面的小节中,我们介绍了使用if和else语句块来产生代码分支.现在,我们来介绍两种类型的循环:while循环和for循环.循环允许我们执行重复性的任务.循环特别重要,没有它们,游戏将无法运行. 1.8.1 while循环 假设你想要编写一个函数打印出所有的正整数,直到达到给定的输入n.解决这个问题的策略(算法)如下. 1. 创建一个新的整型,将其值初始化为1. 2. 如果该整数小于或等于给定的输入n,打印其值.

java控制流程的问题,希望大家帮帮我

问题描述 java控制流程的问题,希望大家帮帮我 求Sn=a+aa+aaa--+aaaa(n个a)?a是1-9的随机数,n是5-10的随机数,,,用Java控制执行流程怎么实现 解决方案 随机就用math.random()随机出数来 好像是double类型的吧 我忘了 搞出随机数什么都好说

《张成功项目管理记》一坚持执行整体变更控制流程不动摇

坚持执行整体变更控制流程不动摇 张成功项目管理记管理贵在坚持,张成功对此深有感触. 在项目的执行过程中,张成功始终坚持执行和项目建设方约定的需求变更控制流程(实际上就是项目整体变更控制流程的一个主要方面)不动摇(见图6- 9). 有一次,项目建设方项目经理郝127.tif枋非常着急地打电话给张成功,说他们副厅长有一个需求变更,要求张成功不要走整体变更控制就立即响应.张成功给郝127.tif枋做了不按"规矩"办事而随意变更弊远远大于利的解释无果后,言辞诚恳地打电话给该副厅长说明了理由.因