Dart3.5语法28-29
- 人工智能
- 2025-08-26 02:21:01

028问号可选类型可空类型保存null空String的isEmpty和NotEmpty
?问号可选类型可空类型保存null叹号强制解包??双冒号运算符String的isEmpty和isNotEmpty
? 问号可选类型,可空类型
可选类型可以保存null,就是空的意思
String.isEmpty 是判断是否是空白字符串,他并不是null,不是空,依然有值,只不过值是空白字符串""
isNotEmpty跟isEmpty完全相反,是判断是否不是空白字符串
如果给可选类型赋值null,那么isEmpty不能运行
!强制解包,把可选类型变成非可选类型,例如把String?变成String,把int? 变成int但是如果可选类型里面保存的值是null,那么运行报错
str!; //!强制解包,把?可选类型变成正常的String类型,但是因为str!强制解包以后,里面真的是一个null,运行会报错
双冒号?? 运算符,代表,如果?? 左边是null,那么就返回右边的值,如果左边不是null,那么就返回做编制
1. 问号可选类型(可空类型) main() { // ? 问号可选类型,可空类型 int? i1 = 100; i1 = null; // null代表空 print(i1); } 运行结果 null 解释int? i1 = 100; 定义了一个可选类型(可空类型)的变量 i1,它可以存储 int 类型的值,也可以是 null。
i1 = null; 将 i1 赋值为 null,表示该变量不保存任何有效值。
print(i1); 输出 null,因为 i1 被赋值为 null。
2. 可选类型的默认值 main() { // 如果可选类型没有赋值初始值,那么默认值是null int? i2; print(i2); } 运行结果 null 解释
int? i2; 声明了一个可选类型的变量 i2,但是没有给它赋初值。
Dart 中可选类型(?)的变量如果没有显式赋值,则默认值是 null。
print(i2); 输出 null,因为 i2 没有赋值,默认值为 null。
3. 字符串可选类型 main() { String? str; str = "abc"; print(str); } 运行结果 abc 解释String? str; 声明了一个可选类型的字符串变量 str,它可以存储一个 String 类型的值或 null。
str = "abc"; 将 str 赋值为一个非空字符串 "abc"。
print(str); 输出 abc,因为 str 被赋值为字符串 "abc"。
4. 使用 isEmpty 和 isNotEmpty 判断字符串是否为空 main() { String? str; str = "abc"; bool r1 = str.isEmpty; // 判断str是否为空字符串(""),此时str为"abc",返回false r1 = str.isNotEmpty; // 判断str是否不是空字符串,此时str为"abc",返回true print(r1); } 运行结果 true 解释str.isEmpty; 判断 str 是否为空字符串。由于 str 的值是 "abc",它不是空字符串,因此 isEmpty 返回 false。
str.isNotEmpty; 判断 str 是否不是空字符串。由于 str 的值是 "abc",它不是空字符串,因此 isNotEmpty 返回 true。
print(r1); 输出 true,因为最后 r1 保存的是 str.isNotEmpty 的返回值。
029可空类型叹号强制解包问号双问号运算符trycatch捕获异常 1. 强制解包(!) // 因为可选类型不能进行 运算,例如 判断是否 >60,所以用 !强制解包,把 可选类型变成普通的非空类型 // !强制解包,把可选类型变成非可选类型,例如把String?变成String,把int? 变成int但是如果可选类型里面保存的值是null,那么运行报错 //把可选类型当做函数形参 /* try{ //容易出错的代码 }catch(e){ //出错后执行的代码 } */score! 是 Dart 中的 强制解包运算符。它的作用是将一个可选类型(例如 int?,即可以为 null 或 int 的类型)转换为非空类型(int)。
score 是一个 int? 类型的变量,意味着它可以存储一个 int 或者 null。但通过 ! 运算符,开发者明确告诉 Dart 编译器:“我确定 score 不是 null,请将其作为非空的 int 来处理。”
如果 score 的值为 null,在执行 score! 时,Dart 会抛出一个运行时异常,程序会中断。
fn1(int? score) { // 强制解包 try { score!; // 当强制解包里面存的值是null的时候,程序会中断 if (score > 60) { print("及格"); } else { print("不及格"); } } catch (e) { print("e=$e"); } var s2 = score; // 上面的强制解包在try里面,作用于不一样,这里score没有去掉null,还是可选类型 score = 100; // score!; // 这里运行会有警告,因为上面已经给score赋值了0,那么编译器已经把score当做int类型来看,不能再使用强制解包 } 运行结果如果传递
null给
score,程序会抛出异常并输出:
e=NoSuchMethodError: The method '>' was called on null.如果传递
100给
score,程序会输出:
及格 解释score! 是强制解包,它将可选类型(int?)转换为非空类型(int)。如果 score 是 null,解包时程序会抛出异常。
在 try-catch 语句中,catch 捕获了异常并打印了错误信息。
当 score 被赋值为 100 后,强制解包就不会再出错,程序判断并输出 "及格"。
2. 警告:强制解包后的类型 score = 100; score!; // 这里运行会有警告,因为score已经被赋值为int类型 运行结果没有输出,但会在编译时显示警告:
Warning: Operand of null-aware operation '!' has type 'int' which excludes null. 解释score 已经被赋值为 100,它的类型变成了 int,不再是可选类型 int?。此时,再使用 ! 强制解包会导致编译时警告,因为 score 已经是一个非空类型,! 强制解包不再适用。
3. 双问号运算符(??) fn2(String? str) { var str2 = str ?? "默认值"; print("str2=$str2"); str=“abc”; str;//这里已经变成了String //这里因为str是String所以不能用 ??去运算,会有警告Warning: Operand of null-aware operation '??' has type 'String' which excludes null. } 运行结果如果传递
"abc"给
str,输出:
str2=abc如果传递
null给
str,输出:
str2=默认值 解释这段代码处理了 null 值的情况,当 str 为 null 时,提供一个默认值。
双冒号?? 运算符,代表,如果?? 左边是null,那么就返回右边的值,如果左边不是null,那么就返回左边的值
str.isEmpty;//注意可选类型不能直接使用在String的方法,需要先转化成String类型
var str2 = str!;//之前我们用强制解包,但是如果遇到null就会中断,需要用try catch来捕获异常
4. 使用 ?. 运算符 fn3(String? str) { var r1 = str?.isEmpty ?? false; print("r1=$r1"); } 运行结果如果传递
"abc"给
str,输出:
r1=true如果传递
null给
str,输出:
r1=false 解释?. 运算符是可空类型的安全访问运算符。它会检查 str 是否为 null,如果是 null,则直接返回 null,否则调用 isEmpty 方法。
如果 str 是 null,r1 会被赋值为 false(通过 ?? 提供默认值)。如果 str 是非 null 字符串,则调用 isEmpty 方法判断字符串是否为空。
5. 综合示例:强制解包与空值判断 main() { fn1(null); fn1(100); int? i1 ; i1 > 100; var i2=i1; fn2("abc"); fn2(null); fn3("abc"); fn3(null); } 运行结果 e=NoSuchMethodError: The method '>' was called on null. 及格 str2=abc str2=默认值 r1=true r1=false 解释fn1(null):传递 null 给 score,程序会抛出异常并输出错误信息。
fn1(100):传递 100 给 score,程序不会抛出异常,并输出 "及格"。
fn2("abc"):传递 "abc" 给 str,返回 str 本身,输出 "str2=abc"。
fn2(null):传递 null 给 str,返回默认值 "默认值",输出 "str2=默认值"。
fn3("abc"):传递 "abc" 给 str,检查是否为空,输出 r1=true。
fn3(null):传递 null 给 str,由于 str 为 null,输出 r1=false。
Dart3.5语法28-29由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Dart3.5语法28-29”
下一篇
Python的内置模块有哪些?