(四十)Dart 中的空安全(Null Safety)教程

Dart 中的空安全(Null Safety)教程

空安全简介

空安全(Null Safety)是 Dart 语言的一项重要特性,旨在帮助开发者避免空指针异常(NullPointerException)。空安全通过在编译时检查变量是否可能为 null,从而减少运行时错误。从 Flutter 2.2.0(2021年5月19日发布)开始,所有新项目都要求使用空安全。

空安全的关键概念

1. 可空类型(Nullable Types)

在 Dart 中,可以通过在类型后面加上 ? 来表示该类型可以为 null。例如:

dart 复制代码
String? username; // 可空类型
int? a; // 可空类型
List<String>? l1; // 可空类型

这些变量可以被赋值为 null,也可以被赋值为具体的值。

2. 非空类型(Non-Nullable Types)

如果没有加上 ?,则该类型是非空的,不能被赋值为 null。例如:

dart 复制代码
String username = "张三"; // 非空类型
int a = 123; // 非空类型
List<String> l1 = ["张三", "李四", "王五"]; // 非空类型

这些变量不能被赋值为 null,否则会报编译错误。

3. 类型断言(Type Assertion)

使用 ! 运算符可以对可空类型进行类型断言,表示你确定该变量不为 null。例如:

dart 复制代码
String? str = "this is str";
print(str!.length); // 类型断言

如果 strnull,则会抛出异常。

示例代码解析

以下代码展示了如何使用空安全特性:

dart 复制代码
String? getData(apiUrl) {
  if (apiUrl != null) {
    return "this is server data";
  }
  return null;
}

void printLength(String? str) {
  try {
    print(str!.length); // 类型断言
  } catch (e) {
    print("str is null");
  }
}

void main(args) {
  // 可空类型
  String? username = "张三";
  username = null;
  print(username);

  int? a = 123;
  a = null;
  print(a);

  List<String>? l1 = ["张三", "李四", "王五"];
  l1 = null;
  print(l1);

  // 调用方法
  print(getData("http://www.itying.com"));
  print(getData(null));

  // 类型断言
  printLength("str");
  printLength(null);
}

代码说明

  1. 可空类型

    • String? username:表示 username 可以为 null
    • int? a:表示 a 可以为 null
    • List<String>? l1:表示 l1 可以为 null
  2. 非空类型

    • String username = "张三":表示 username 不能为 null
    • int a = 123:表示 a 不能为 null
    • List<String> l1 = ["张三", "李四", "王五"]:表示 l1 不能为 null
  3. 类型断言

    • str!.length:表示你确定 str 不为 null,否则会抛出异常。
    • try-catch:捕获可能的异常,避免程序崩溃。

输出结果

运行上述代码,输出结果为:

复制代码
null
null
null
this is server data
null
str
str is null

注意事项

  1. 避免不必要的类型断言

    尽量避免使用 ! 运算符进行类型断言,除非你确定变量不为 null。否则,可能会导致运行时异常。

  2. 使用 iftry-catch 检查 null

    在处理可空类型时,建议使用 iftry-catch 来检查变量是否为 null,以避免潜在的空指针异常。

  3. 空安全的好处

    • 减少运行时错误:空安全可以在编译时检查潜在的空指针异常。
    • 提高代码可读性:通过明确区分可空类型和非空类型,代码更加清晰易懂。
    • 优化性能:空安全可以减少不必要的空检查,提高程序性能。

总结

通过使用空安全特性,可以显著减少空指针异常的发生,提高代码的健壮性和可维护性。在实际开发中,合理使用可空类型和非空类型,以及类型断言,可以让你的代码更加安全和高效。希望本教程对您有所帮助!

相关推荐
川石课堂软件测试几秒前
Android和iOS APP平台测试的区别
android·数据库·ios·oracle·单元测试·测试用例·cocoa
花卷HJ18 分钟前
Android 通用 BaseDialog 实现:支持 ViewBinding + 全屏布局 + 加载弹窗
android
生产队队长34 分钟前
Linux:awk进行行列转换操作
android·linux·运维
叶羽西1 小时前
Android15 EVS HAL中使用Camera HAL Provider接口
android
2501_915918411 小时前
除了 Perfdog,如何在 Windows 环境中完成 iOS App 的性能测试工作
android·ios·小程序·https·uni-app·iphone·webview
泓博1 小时前
Android状态栏文字图标设置失效
android·composer
叶羽西2 小时前
Android15系统中(娱乐框架和车机框架)中对摄像头的朝向是怎么定义的
android
Java小白中的菜鸟2 小时前
安卓studio链接夜神模拟器的一些问题
android
莫比乌斯环2 小时前
【Android技能点】深入解析 Android 中 Handler、Looper 和 Message 的关系及全局监听方案
android·消息队列
编程之路从0到12 小时前
React Native新架构之Android端初始化源码分析
android·react native·源码阅读