磐石网站seo宝安第一网站
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() {// 如果可选类型没有赋值初始值,那么默认值是nullint? 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",返回falser1 = str.isNotEmpty; // 判断str是否不是空字符串,此时str为"abc",返回trueprint(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。
