热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dartstring转bool_Dart语言(一)基础语法

一、Dart基本特色概念所有变量的值都是对象,也就是类的实例。数字、函数和null也都是对象,都继承自Object类。虽然Dart是强类型语言ÿ

a6a33d8dbc87812f9f222d6bf1e30628.gif

一、Dart基本特色概念
  1. 所有变量的值都是对象,也就是类的实例。数字、函数和null也都是对象,都继承自Object类。
  2. 虽然Dart是强类型语言,但Dart支持类型推断,显示变量类型声明是可选的。没有指定类型的变量的类型为dynamic。可以通过使用类型或者编译时常量来帮助Dart去捕获异常以及让代码运行更高效。
  3. Dart支持泛型,List表示包含int类型的列表,List则表示包含任意类型的列表。(List等同于List)

  4. Dart支持顶层(Top-level)函数(例如:main()),也支持类中定义函数(静态函数和实例函数),也支持嵌套函数和本地函数。
  5. Dart支持顶层变量和类成员变量。

  6. Dart没有public、protected和private这些关键字,使用下划线_开头的变量或函数,表示库内可见。
二、语法预览

//程序入口函数main() { //42,字面量,编译时常量 var number = 42; // 定义的一个变量,dynamic printNumber(number); print('number ${number.runtimeType}'); //打印number的运行时类型}printNumber(num number) { print('The number is $number');// return null;如果函数没有返回值,此处默认返回null}//打印结果The number is 42number int(1)所有的函数都返回一个值。如果没有指定返回值,则默认把return null作为函数的最后一个语句执行。(2)main()方法是Dart程序执行的入口方法,每个程序都需要一个这样的方法。    1.main()方法签名的void可有可无。    2.main()方法有一个可选的List参数,此参数在Android studio运行时配置,如图:

68c47f4567d467c24a1fb04550ac2168.png

ecdae25b0a38485ee49e8a3f77e548fd.png

(1)var一种不指定类型声明变量的方式。

    1.Dart中一切皆对象,所以没有初始化的默认值都是null,nullNull类的唯一实例。

    2.我们也可以给变量申请一个具体类型,这样有助于编译工具帮我们补全代码,查找bug。如:String name = 'Bob';

    3.在代码风格中,推荐在编写严格API时尽量使用类型声明(规定使用),编写独立应用时尽量使用var声明(快速开发)。

    4.想要知道具体类型,使用runtimeType

(2)var number = 42;中42 是一个字面量。字面量是编译时常量。

(3)num是一个类型(类型接口,子类有intdouble)。

(4)print()是打印语句,参数可以是a+b,a,” “,’ '都行。

三、内置类型

Numbers(数值)

(1)intdouble都是数值类型&#xff0c;都是num的子类。1.int是整数型&#xff0c;取值范围在-2^53 和 2^53 之间。1&#xff0c; 2&#xff0c;3 &#xff0c;4 …2.double是浮点型 &#xff0c; 64位。1.2324, …(2)num类型定义了基本的操作符&#xff0c;例如&#43; &#xff0c;- &#xff0c; *&#xff0c; / &#xff0c;&#61; &#xff0c;<&#61;等等&#xff0c;还定义了abs()&#xff0c;ceil()&#xff0c;floor()等函数。

int i &#61; 1;double d &#61; 1.2;num j &#61; 1;num k &#61; 1.2;

String字符串

(1)字符串可以使用双引号" "&#xff0c;单引号’ ‘或三个单引号’’’  ‘’’。

    1.双引号和单引号都是定义单行的字符串

    2.三个单引号连用的可以定义多行的字符串类型

    3.Dart 的String 是 UTF-16 编码的一个队列。

String str1 &#61; &#39;abc&#39;;//单引号字符串String str2 &#61; "abc";//双引号字符串//三个&#39;&#xff0c; &#39; 或 " (不能混合使用)来定义多行的String类型&#xff0c;注意str3和str4的显示区别String str3 &#61; &#39;&#39;&#39;abc def&#39;&#39;&#39;;String str4 &#61; "abc" "def";String str5 &#61; "abc"&#43;"def";//str4和str5是一样的print("str1 &#61; $str1");//abcprint("str2 &#61; $str2");//abcprint("str3 &#61; $str3");//abc \n def 此处是两行 中间的回车和空格也被打印出来了print("str4 &#61; $str4");//abcdef 此处忽略了回车和空格print("str5 &#61; $str5");//abcdef

(2)r前缀是忽略转义符&#xff0c;创建一个”原始raw“的字符串。可以打印完整的url。

//通过提供一个r前缀可以创建一个 “原始 raw” 字符串,原始字符串中没转义字符var s &#61; r"In a raw string, even \n isn&#39;t special."print("s &#61; $s");//打印结果&#xff1a;In a raw string, even \n isn&#39;t special

(3)字符串与数值之间的转换

// String -> intvar one &#61; int.parse(&#39;1&#39;);// String -> doublevar onePointOne &#61; double.parse(&#39;1.1&#39;);// int -> StringString oneAsString &#61; 1.toString();// double -> String//此处是小数点后保留两位&#xff0c;四舍五入String piAsString &#61; 3.14159.toStringAsFixed(2);piAsString &#61; &#39;3.14&#39;;

Boolean(布尔值)

(1)只有true和false两个值&#xff0c;但只有true对象还被认为是true。(2)使用bool的类型

bool flagTrue &#61; true &#xff1b;bool flagFalse &#61; false &#xff1b;if(1){}//错误不可这么写if(1 !&#61; 0){}if(true){}if(false){}

Lists(列表)

(1)List中可指定类型&#xff0c;如List&#xff0c;List等&#xff0c;也可不指定类型&#xff0c;此时默认为任意型&#xff0c;可混合保存
(2)List可以直接定义一个具体的类别&#xff0c;也可以new一个实例&#xff0c;然后添加。
(3)其中的元素可以使用runtimeType查看运行时的类型。
(4)List类中提供各种API&#xff0c;类似java中的list。
(5)遍历元素 使用forEach(void f(E element))

//直接定义int类型的列表List list1 &#61; [1, 2, 3];//直接定义String类型的列表List list2 &#61; [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];//直接定义可存放任意类型的列表var list3 &#61; [1, &#39;a&#39;, 3];//new出list实例,可添加元素var list4 &#61; new List();list4.add(4);list4.add("dart");list4.add(6);//列表中一些常用方法list1.[1];//2list2.length;//3[].length;//0[].isEmpty;//true[&#39;a&#39;].isEmpty;//falseprint(&#39;list1 &#61; $list1&#39;);//list1 &#61; [1, 2, 3]print(&#39;list2 &#61; $list2&#39;);//list2 &#61; [a, b, c]print(&#39;list3 &#61; $list3&#39;);//list3 &#61; [1, a, 3]print(&#39;list4 &#61; $list4&#39;);//list4 &#61; [4, dart, 6]print(&#39;${list3[0].runtimeType},${list3[1].runtimeType}&#39;);//int,String//runtimeType&#xff0c;返回(运行时类型)对象的类型//遍历元素 使用forEach(void f(E element)) list4.forEach((a){ print(a); });//打印结果4dart6

map

(1)map是键值对形式的集合。键可以是任意类型。(2)遍历元素  使用forEach(void f(K key, V value))

//直接定义// Keys &#xff1a;Valuesvar colors1 &#61; { &#39;first&#39; : &#39;red&#39;, 12: &#39;green&#39;, &#39;third&#39; : &#39;blue&#39;};print(&#39;colors1 &#61; $colors1&#39;);//colors1 &#61; {first: red, 12: green, third: blue}print(colors1[12]);//greenvar colors2 &#61; new Map();//中括号内为key&#xff0c;等号右为值colors2[&#39;first&#39;] &#61; &#39;red&#39;;colors2[&#39;second&#39;] &#61; &#39;green&#39;;colors2[&#39;third&#39;] &#61; &#39;blue&#39;;//通过map中的key获取value,如果所查找的key不存在&#xff0c;则返回 null&#xff1a;print(&#39;colors2[&#39;first&#39;]&#61;${colors2[&#39;first&#39;]}&#39;);//&#39;colors2[&#39;first&#39;]&#61;red//获取长度print(&#39;colors2.length &#61; ${colors2.length}&#39;);//colors2.length &#61; 3//遍历元素colors2.forEach((key,value){ print(&#39;key &#61; $key&#xff1b;value &#61; $value&#39;); });//打印结果key &#61; first&#xff1b;value &#61; redkey &#61; second&#xff1b;value &#61; greenkey &#61; third&#xff1b;value &#61; blue

Runes符号文字 (不常用)

(1)Dart语言中String字符串是一系列UTF-16代码单元&#xff0c;Sting的codeUnits和codeUnitAt属性可以获取UTF-16字符集的字符。
(2)通常使用 \uXXXX 的方式来表示 Unicode code point&#xff0c;这里的 XXXX 是4个 16 进制的数。例如&#xff0c;心形符号 (♥) 是 \u2665。对于非 4 个数值的情况&#xff0c;把编码值放到大括号中即可。例如&#xff0c;笑脸 emoji (?) 是 \u{1f600}。
(3)如果String字符串中需要表示32位Unicode值需要使用runes来获取UTF-32的字符集的字符。
(4)runes代表字符串的 UTF-32 code points。

var clapping &#61; &#39;\u{1f44f}&#39;; print(clapping); print(clapping.codeUnits);//16-bit print(clapping.codeUnitAt(1)); print(clapping.runes.toList());//32-bit Runes input &#61; new Runes( &#39;\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}&#39;); print(new String.fromCharCodes(input));//打印结果?[55357, 56399]56399[128079]♥  ?  ?  ?  ?  ?注意&#xff1a;
使用 list 操作 runes 的时候请小心。根据所操作的语种、字符集等&#xff0c;这种操作方式可能导致你的字符串出问题。

##Symbols标志(基本用不上)

一个 Symbol object 代表 Dart 程序中声明的操作符或者标识符。你也许从来不会用到 Symbol&#xff0c;但是该功能对于通过名字来引用标识符的情况 是非常有价值的&#xff0c;特别是混淆后的代码&#xff0c; 标识符的名字被混淆了&#xff0c;但是 Symbol 的名字不会改变。
使用 Symbol 字面量来获取标识符的 symbol 对象&#xff0c;也就是在标识符 前面添加一个 # 符号&#xff1a;

#radix#barSymbol 字面量定义是编译时常量。四、Functions(方法)

(1)基本特点

1.Dart中方法也是一个对象&#xff0c;类型为Function。2.方法可以赋值给变量&#xff0c;也可以当做其他方法的参数&#xff0c;也可把Dart类的实例当做方法来调用。3.方法有返回值&#xff0c;如果没有指定返回值&#xff0c;默认将return null;作为最后语句返回null。4.main()方法是程序的入口方法。5.Dart中没有final方法&#xff0c;几乎所有方法都允许重写(部分内置的操作符除外)6.当方法只有一个表达式时&#xff0c;可以使用**&#61;>**缩写。7.方法中的返回类型和参数类型可以省略。

//平时使用方式String sayHello1(String name){ return &#39;Hello $name!&#39;; //return print(&#39;Hello $name!&#39;);//print();方法返回的是void}//这样也是可以的&#xff0c;忽略类型定义sayHello2(name){ return &#39;Hello $name!&#39;;}//对于只有一个表达式的方法&#xff0c;你可以选择使用缩写语法来定义&#xff1a;sayHello3(name) &#61;> &#39;Hello $name!&#39;;//注意&#xff1a;在箭头 (&#61;>) 和冒号 (;) 之间只能使用一个表达式 –- 不能使用语句。表达式计算后通常会返回一个单独的值.//例如下面这些&#xff0c;注释后面的就是表达式&#xff1a;int i &#61; 10;//i &#61; 10anArray[0] &#61; 10;//anArray[0] &#61; 100int result &#61; 1 &#43; 2; // result &#61; 1 &#43; 2if (value1 &#61;&#61; value2)//value1 &#61;&#61; value2//方法也可以赋值给一个变量--类似函数指针var sayHello4 &#61; (name)&#61;>&#39;Hello $name!&#39;;(2)函数闭包一个 闭包 是一个方法对象&#xff0c;不管该对象在何处被调用&#xff0c; 该对象都可以访问其作用域内 的变量。方法可以封闭定义到其作用域内的变量。下面的示例中&#xff0c;makeAdder() 捕获到了变量 addBy。不管你在那里执行 makeAdder() 所返回的函数&#xff0c;都可以使用 addBy 参数。

//返回值为FunctionFunction makeAdder(num addBy) { return (num i) &#61;> addBy &#43; i;}main() { //方法可以赋值给变量&#xff0c; //此时将makeAdder的返回值(num i) &#61;> addBy &#43; i 赋值给add2和add4 var add2 &#61; makeAdder(2);//add2(num i) &#61;> 2 &#43; i&#xff1b; var add4 &#61; makeAdder(4);//add2(num i) &#61;> 4 &#43; i&#xff1b; //断言 判断内容是否正确&#xff0c;错误会抛出异常 assert(add2(3) &#61;&#61; 5);//add2(3)&#61;5 assert(add4(3) &#61;&#61; 7);//add4(3)&#61;7}(3)typedef 别名

    1.typedef 是方法的简单的别名&#xff0c;它提供了一种方法来检查任何函数的类型。

    2.typedef定义的别名方法有返回值&#xff0c;那么定义的方法不仅要参数匹配&#xff0c;返回值也要一样&#xff0c;否则或报错。

    3.typedef定义的别名方法没有返回值&#xff0c;那么只要参数匹配就可以了。

定义typedef的别名方法也可以使用泛型。

typedef int Compare(int a, int b);typedef Fun1(int a, int b);typedef Fun(T a, K b);int sort(int a, int b) &#61;> a - b;main() { assert(sort is Compare); // True!}

typedef int Compare(int a, int b);typedef Fun1(int a, int b);typedef Fun2(T a, K b);int add(int a, int b) { print(&#39;a * b&#39;); return a * b;} add1(int a, int b) { print(&#39;a &#43; b&#39;); return a &#43; b;} add2(String a, int b) { print(&#39;a &#61; b&#39;); return &#39;a &#61; &#39; &#43; b.toString();}class Demo1 { Demo1(int f(int a, int b), int x, int y) { var sum &#61; f(x, y); print("sum1 &#xff1a;$sum"); }}class Demo2 { Demo2(Fun1 f, int x, int y) { var sum &#61; f(x, y); print("sum2 &#xff1a;$sum"); }}class Demo3 { Demo3(Fun2int> f, String x, var sum &#61; f(x, y); print("sum3 &#xff1a;$sum"); }}goTypedef() { Demo1 d1 &#61; new Demo1(add, 2, 3); Demo2 d2 &#61; new Demo2(add1, 5, 6); Demo3 d3 &#61; new Demo3(add2, &#39;a&#39;, 6);}main() { goTypedef();}//打印结果a * bsum1 &#xff1a;6a &#43; bsum2 &#xff1a;11a &#61; b sum3 &#xff1a;a &#61; 6目前&#xff0c;typedef 只能使用在 function 类型上。

(4)可选参数的方法

1.可选参数可分为&#xff1a;可选命名的和可选位置的2.方法中参数可以有默认值。赋默认值的方式两种&#xff1a;等号’&#61;‘或者冒号’:’&#xff0c;默认值至少编译时常量。

    a、可选命名参数

    1.在定义时&#xff0c;使用大括号内加参数{paramName param1,param2...}的形式定义参数&#xff0c;类型可有可无。2.在调用时&#xff0c;使用paramName : value来指定命名参数。可指定任意参数&#xff0c;没有顺序要求。

//定义可选命名参数的方法//赋默认值的方式两种&#xff1a;等号&#39;&#61;&#39;或者冒号&#39;:&#39;&#xff0c;FunA(bool a, {b, c:3, d&#61;4, e}){ print(&#39;a &#61; $a,b &#61; $b,c &#61; $c,d &#61; $d,e &#61; $e&#39;);}void main(){ //调用 FunA(true,b:2,e:5); FunA(false,b:"one",c:5,);}//打印结果a &#61; true,b &#61; 2,c &#61; 3,d &#61; 4,e &#61; 5a &#61; false,b &#61; one,c &#61; 5,d &#61; 4,e &#61; null

    b、可选位置参数

   1.在定义时&#xff0c;使用中括号内加参数[paramName param1,param2…]&#96;的形式定义参数&#xff0c;类型可以有可无。2.在调用时&#xff0c;直接传入参数就行&#xff0c;但是参数位置是按顺序赋值的&#xff0c;如果要给最后一个参数传值&#xff0c;前面的参数也要传值。

//定义可选位置//赋默认值只有一种方式&#xff1a;等号&#39;&#61;&#39;FunB(a, [b, c&#61;3, d&#61;4, e]){ print(&#39;a &#61; $a,b &#61; $b,c &#61; $c,d &#61; $d,e &#61; $e&#39;);}//调用main() { FunB(true,2, 5); FunB(false,"one",5,6,7);}//打印结果a &#61; true,b &#61; 2,c &#61; 5,d &#61; 4,e &#61; nulla &#61; false,b &#61; one,c &#61; 5,d &#61; 6,e &#61; 7

    c、以List&#xff0c;map作为默认参数

void doStuff( {Listlist &#61; const [1, 2, 3], Map gifts &#61; const { &#39;first&#39;: &#39;paper&#39;, &#39;second&#39;: &#39;cotton&#39;, &#39;third&#39;: &#39;leather&#39; }}) { print(&#39;list: $list&#39;); print(&#39;gifts: $gifts&#39;);}main() { doStuff();}//打印结果list: [1, 2, 3]gifts: {first: paper, second: cotton, third: leather}

(5)方法可作为参数被调用

//定义一个普通方法printNumber(name) { print(name);}main() { var list &#61; [1, 2, 3]; //可以把方法当做参数调用另外一个方法 list.forEach(printNumber); //匿名方法 list.forEach((i){ print(i); });}//打印结果都是 1 2    3五、操作符(1)Dart中定义的操作符

下表为Dart中定义的操作符&#xff0c;很多操作符是可以重载的。

描述操作符解释
unary postfix 一元后缀expr&#43;&#43; 自增 expr--自减 () 调用方法 []访问列表元素 . 访问元素 ?.条件非空判断用在表达式后
unary prefix  一元前缀-expr负号 !expr 取反 ~expr 补码&#43;&#43;expr 自增 --expr自减用在表达式前
基本运算符&#43; 加 -减 * 乘 / 除&#xff0c;除不尽就显示小数% 取模 ~/除后取z整~/与java中/效果一样&#xff0c;其余与java中操作符运算一样
Bitwise and shift operators(位和移位操作符)<< 左移 >> 右移 &位与 | 位或 ^位异或与java中操作符运算一样
Equality and relational operators(相等相关的操作符)>&#61; 大于等于 > 大于 <&#61; 小于等于 < 小于&#61;&#61; 等于 !&#61; 不等于与java中操作符运算一样
Assignment operators(赋值操作符)&#61; 直接赋值 *&#61; 乘后赋值 >>&#61;右移后赋值~/&#61; 取余后赋值 %&#61; 取模后赋值 &#43;&#61; 加后赋值-&#61; 减后赋值 <<&#61; 左移后赋值/&#61; 除后赋值&&#61; 位与后赋值 ^&#61; 异或后赋值 |&#61; 位或后赋值 ??&#61;非空判断后赋值‍??&#61;java中没有&#xff0c;Dart中特有的
Type test operators(类型判定操作符)as、 is、 is!都是java中没有&#xff0c;Dart中特有的
Logical operators(逻辑操作符)!expr取反 || 逻辑或 &&逻辑与与java中操作符运算一样
if null 如果空判断??效果与三目表达式一样
conditional 三目expr1 ? expr2 : expr3与java中操作符运算一样
Cascade notation (级联操作符)..java中没有&#xff0c;Dart中特有的

2、Dart中特有的操作符

(1)as&#xff0c;is&#xff0c;is! 类型判断操作符

操作符解释
as类型转换 (把左边对象转换为右边特定的类型)
is如果对象是指定的类型返回 True(检查is左边的类型是否是右边的类型)
is!如果对象是指定的类型返回 False(检查is左边的类型是否是右边的类型)
1.使用isis!时&#xff0c;只有obj实现了T的接口&#xff0c;obj is T才是true。2.使用as时&#xff0c;如果左边obj未实现右边T&#xff0c;则使用obj as T会抛异常。所以在使用as时要先使用is判断类型。

if (emp is Person) { // Type check&#xff0c;如果emp不是Person子类&#xff0c;是false&#xff0c;就不会跳进 emp.firstName &#61; &#39;Bob&#39;;}//如果emp为null不是Person类型&#xff0c;则(emp as Person)就会抛出异常(emp as Person).firstName &#61; &#39;Bob&#39;;//建议这样书写if(emp is Person){ (emp as Person).firstName &#61; &#39;Bob&#39;;}(2) ??&#61;

??&#61; 操作符用来指定值为 null 的变量的值。

main() { var b; b &#61; 2; //给 b 变量赋值 print(&#39;给b赋值后 b &#61; $b&#39;); b ??&#61; 1; // 如果 b 是 null&#xff0c;则将1赋值给 b&#xff1b;如果b不是 null&#xff0c;则 b 的值保持不变 print(&#39;b ??&#61; 1操作后 b &#61; $b&#39;); b &#61; null; print(&#39;将b置为null后 b &#61; $b&#39;); b ??&#61; 1; print(&#39;b ??&#61; 1操作后 b &#61; $b&#39;);}//打印结果给b赋值后 b &#61; 2b ??&#61; 1操作后 b &#61; 2将b置为null后 b &#61; nullb ??&#61; 1操作后 b &#61; 1

(3)?? 效果类似三目运算

b ??&#61; value; // 如果 b 是 null&#xff0c;则赋值给 b&#xff1b;如果不是 null&#xff0c;则 b 的值保持不变

String toString() &#61;> msg ?? super.toString();//两个表达式效果相同String toString() &#61;> msg &#61;&#61; null ? super.toString() : msg;

(4)?.和.类似&#xff0c;但是左边的操作对象不能为 null&#xff0c;例如foo?.bar 如果 foo 为 null 则返回 null&#xff0c;否则返回 bar 成员

class A { var bar &#61; 1;}main() { A foo; print(&#39;foo?.bar &#61;${foo?.bar}&#39;); foo&#61; A(); print(&#39;foo?.bar &#61;${foo?.bar}&#39;);}//打印结果foo?.bar &#61;nullfoo?.bar &#61;1

(5) …级联语法

  1. 级联操作符 (..) 可以在同一个对象上连续调用多个函数以及访问成员变量。
  2. 使用级联操作符可以避免创建临时变量&#xff0c;并且写出来的代码看起来更加流畅&#xff1a;
  3. 在方法上使用级联操作符需要非常小心&#xff0c;无法在返回值为 void 上使用级联操作符
**注意&#xff1a;**严格来说&#xff0c;两个点的级联语法不是一个操作符。只是一个 Dart 特殊语法

class Person { String name; String country; void setCountry(String country){ this.country &#61; country; } String toString() &#61;> &#39;Name:$name\nCountry:$country&#39;;}void main() { Person p &#61; new Person(); p ..name &#61; &#39;Wang&#39; ..setCountry(&#39;China&#39;); print(p);}//打印结果&#xff1a;Name:WangCountry:China六、控制语句##1、if and else 判断语句

  1. 与其他语言的if else使用方式一样。

  2. 在Dart语言中注意对true的定义&#xff0c;只有true对象才被定义为true。

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

##2、for loops for循环

  1. 可以使用标准的for循环

for (var i &#61; 0; i <5; i&#43;&#43;) { ......}

  1. Dart中for循环的闭包可以自己捕获循环的index索引值。获取索引对应的值。

var letters &#61; ["a",&#39;b&#39;,&#39;c&#39;];letters.forEach((letter){ print(&#39;letter &#61; $letter&#39;); });//打印结果letter &#61; aletter &#61; bletter &#61; c

  1. List 和 Set 等实现了 Iterable 接口的类还支持for-in形式的遍历。

List letters &#61; ["a",&#39;b&#39;,&#39;c&#39;];for(var letter in letters){ print(&#39;letter &#61; $letter&#39;); }//打印结果letter &#61; aletter &#61; bletter &#61; c##3、while and do-while loops while循环

  1. while循环&#xff0c;先判断条件&#xff0c;为true进入循环&#xff0c;否则跳过。

int a &#61; 1;while(a <5){ print(&#39;a &#61; $a&#39;); a&#43;&#43;;}//打印结果a &#61; 1a &#61; 2a &#61; 3a &#61; 4

  1. do…while循环&#xff0c;先执行循环代码&#xff0c;然后再判断条件。即此循环至少能执行一次循环语句。

##4、break and continue 控制语句

  1. 使用break来终止循环

main() { var a &#61; 0 ; while(true){ print(&#39;a &#61; $a&#39;); if(a > 2){ print(&#39;a &#61; $a 时终止循环&#39;); break; } a&#43;&#43;; }}//打印结果a &#61; 0a &#61; 1a &#61; 2a &#61; 3a &#61; 3 时终止循环

  1. 使用 continue 来开始下一次循环&#xff1a;

main(){ for (int i &#61; 0; i <4; i&#43;&#43;) { if(i &#61;&#61;2 ){ print(&#39;当i &#61; $i时&#xff0c;跳过此处操作。&#39;); continue; } print(&#39;i &#61; $i&#39;); }}//打印结果i &#61; 0i &#61; 1当i &#61; 2时&#xff0c;跳过此处操作。i &#61; 3##5、switch case1.Dart中switch语句是通过&#61;&#61;来和case后的int &#xff0c;String或者编译时常量的。2.每个非空的case语句都必须有一个break语句。另外也可以通过continue&#xff0c;throw或者return来结束非空的case语句。空的case语句可以省略break语句。3.当没有case语句匹配的时候&#xff0c;可以使用default语句来匹配这种默认情况。4.case都必须是编译时常量&#xff0c;这些常量必须符合以下条件&#xff1a;

  • 都是int的实例
  • 都是String的实例
  • 都是同一个类的实例且该类必须从Object继承了&#61;&#61;的实现
  • switch使用比较&#xff0c;class必须没有覆写操作符

var flag &#61; 1; switch (flag) { case 0: // break;//当注释此处的break&#xff0c;则不会报错&#xff0c;此时flag&#61;0时会继续往下执行 case 1的逻辑 case 1: print(&#39;flag &#61; $flag&#39;); break; //挡注释调此处break时&#xff0c;编译时会报错 case 2: print(&#39;flag &#61; $flag&#39;); break; default://此时flag没有匹配到case语句 print(&#39;flag &#61; $flag&#39;); break;  } 

    5.当switch语句中使用枚举时&#xff0c;在case语句中要把枚举中每个值都写上&#xff0c;或者使用default&#xff0c;否则会报错。

enum Color { red, green, blue }Color color &#61; Color.red;switch (color) { case Color.red: print("color.red"); case Color.blue: print("color.blue"); break; //当注释到以下内容&#xff0c;编译时会报错error: Missing case clause for &#39;green&#39;. //case Color.green: // print("color.green"); // break; //default:}6.在执行了一个case语句后&#xff0c;还想继续执行&#xff0c;可以使用continue语句跳到对应标签继续执行。

enum Color { red, green, blue }main() { Color color &#61; Color.red; switch (color) { case Color.red: print("color.red"); continue goGreen;//定义一个标签&#xff0c;名字随意 case Color.blue: print("color.blue"); break; goGreen://此处标签要与continue对应 case Color.green: print("color.green"); break; default: }}//打印结果color.redcolor.green##6、assert 断言

  1. assert 方法的参数可以为任何返回布尔值的表达式或者方法。如果返回的值为 true&#xff0c;断言执行通过&#xff0c;执行结束。如果返回值为 false&#xff0c;断言执行失败&#xff0c;会抛出一个异常 AssertionError)。
  2. 如果条件表达式结果不满足需要&#xff0c;则可以使用 assert 语句俩打断代码的执行。

int lineCount;assert(lineCount &#61;&#61; null);//断言//如果条件不为 true 则会抛出一个AssertionError异常。七、异常Exceptions

  1. Dart中异常是非检查异常&#xff0c;方法不一定声明了他们所抛出的异常&#xff0c;并且不要钱捕获任何异常。
  2. 如果异常没有捕获&#xff0c;则异常会抛出&#xff0c;导致抛出异常的代码终止执行。
  3. Dart中throw可以抛出任意非null对象作为异常&#xff0c;不仅是提供的ExceptionError类型。
  4. 你可以使用on 或者 catch 来声明捕获语句&#xff0c;也可以同时使用。使用 on 来指定异常类型&#xff0c;使用 catch 来捕获异常对象。
  5. 使用rethrow 关键字可以 把捕获的异常给 重新抛出

void goThrow(num a) { try { getName2(a); print(&#39;继续执行&#39;); } catch (e, s) { //函数 catch() 可以带有一个或者两个参数&#xff0c; 第一个参数为抛出的异常对象&#xff0c; // 第二个为堆栈信息 (一个 StackTrace 对象)。 print("goThrow catch &#61; $e\n$s"); } finally { print(&#39;goThrow finally&#39;); }}getName2(num a) { //你可以使用on 或者 catch 来声明捕获语句&#xff0c;也可以同时使用。 // 使用 on 来指定异常类型&#xff0c;使用 catch 来捕获异常对象。 try { getName(a); } on Exception { print("getName2:Exception"); } on NullThrownError catch (e) { print("getName2 on &#61; $e"); //使用 rethrow 关键字可以 把捕获的异常给 重新抛出。 rethrow; } catch (e) { // 没指定类型&#xff0c;捕获任何异常类型 print("getName2 catch $e"); }}getName(num a) { if (a &#61;&#61;0) { throw new NullThrownError(); }else if(a &#61;&#61; 1){ throw "不为0"; } print(&#39;准备执行&#39;);}main() { goThrow(1); //goThrow(0); //goThrow(3);}//goThrow(1);打印结果getName2 catch 不为0继续执行goThrow finally//goThrow(0);打印结果getName2 on &#61; Throw of null.goThrow catch &#61; Throw of null.#0 getName (file:///D:/project/flutter_app/lib/demo1.dart:36:5)#1 getName2 (file:///D:/project/flutter_app/lib/demo1.dart:21:5)#2 goThrow (file:///D:/project/flutter_app/lib/demo1.dart:6:5)#3 main (file:///D:/project/flutter_app/lib/demo1.dart:44:3)#4 _startIsolate. (dart:isolate/runtime/libisolate_patch.dart:289:19)#5      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)goThrow finally//goThrow(3);打印结果 准备执行继续执行goThrow finally

6f8320eb5e96942a45fcbc5ba94657ce.gif

9f247379b7cc50742f2b476a5d214829.gif




推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文介绍了Java调用Windows下某些程序的方法,包括调用可执行程序和批处理命令。针对Java不支持直接调用批处理文件的问题,提供了一种将批处理文件转换为可执行文件的解决方案。介绍了使用Quick Batch File Compiler将批处理脚本编译为EXE文件,并通过Java调用可执行文件的方法。详细介绍了编译和反编译的步骤,以及调用方法的示例代码。 ... [详细]
  • 在开发中,有时候一个业务上要求的原子操作不仅仅包括数据库,还可能涉及外部接口或者消息队列。此时,传统的数据库事务无法满足需求。本文介绍了Java中如何利用java.lang.Runtime.addShutdownHook方法来保证业务线程的完整性。通过添加钩子,在程序退出时触发钩子,可以执行一些操作,如循环检查某个线程的状态,直到业务线程正常退出,再结束钩子程序。例子程序展示了如何利用钩子来保证业务线程的完整性。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
author-avatar
mobiledu2502859427
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有