(四十)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. 空安全的好处

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

总结

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

相关推荐
字节暗面18 分钟前
四款 APP 加固强度测评:让 AI 拆了四个包,结果有点出乎意料
android·逆向工程·加固
网安蟹佬霸44 分钟前
蓝队防御实战:SIEM与SOAR构建安全运营中心(万字详解+实战配置)
android·安全·web安全·网络安全·网安
敢敢のwings2 小时前
世界模型与FlashWorld:从“在梦中学习“到秒级3D场景生成
android·学习·3d
Dovis(誓平步青云)2 小时前
牛奶不能减成负数:冰箱库存的筛选、去重与不可变更新
android·java·开发语言
Awna3 小时前
MySQL 存储空间与索引运维实战:从空间排查到在线扩容
android·运维·mysql
智购科技无人售货机工厂3 小时前
2026自动售货机触摸屏驱动开发:从I2C协议到多点触控校准的工程实践~YH
android·驱动开发·python·单片机·云原生·django
又见情义4 小时前
RK3568 Android 13驱动适配-WiFi&BT模块(RTL8822CS)
android·arm开发·驱动开发
美狐美颜SDK开放平台4 小时前
直播APP源码如何实现美颜功能?视频美颜SDK开发方案详解
android·大数据·人工智能·计算机视觉·直播美颜sdk
pengyu4 小时前
【Kotlin 协程修仙录 · 化神境 · 后阶】 | 异常天劫:Flow 异常处理的终极奥义与重试之道
android·kotlin
又见情义4 小时前
RK3568 Android 13 LED指示灯适配实战
android·驱动开发