当前位置: 首页 > news >正文

Dart 3.5语法 28-29

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. 使用 isEmptyisNotEmpty 判断字符串是否为空

 main() {String? str;str = "abc";​bool r1 = str.isEmpty;  // 判断str是否为空字符串(""),此时str为"abc",返回falser1 = 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?,即可以为 nullint 的类型)转换为非空类型(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)。如果 scorenull,解包时程序会抛出异常。

  • 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 值的情况,当 strnull 时,提供一个默认值。

  • 双冒号?? 运算符,代表,如果?? 左边是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 方法。

  • 如果 strnullr1 会被赋值为 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):传递 nullscore,程序会抛出异常并输出错误信息。

  • fn1(100):传递 100score,程序不会抛出异常,并输出 "及格"

  • fn2("abc"):传递 "abc"str,返回 str 本身,输出 "str2=abc"

  • fn2(null):传递 nullstr,返回默认值 "默认值",输出 "str2=默认值"

  • fn3("abc"):传递 "abc"str,检查是否为空,输出 r1=true

  • fn3(null):传递 nullstr,由于 strnull,输出 r1=false

相关文章:

Dart 3.5语法 28-29

028问号可选类型可空类型保存null空String的isEmpty和NotEmpty ?问号可选类型可空类型保存null叹号强制解包??双冒号运算符String的isEmpty和isNotEmpty ? 问号可选类型,可空类型 可选类型可以保存null,就是空的意思 String.isEmpty 是判断是否是空白字符串,他并不是null…...

利用AFE+MCU构建电池管理系统(BMS)

前言 实际BMS项目中,可能会综合考虑成本、可拓展、通信交互等,用AFE(模拟前端)MCU(微控制器)实现BMS(电池管理系统)。 希望看到这篇博客的朋友能指出错误或提供改进建议。 有纰漏…...

【教学类-89-06】20250220新年篇05——元宵节灯笼

背景需求: 每年元宵、国庆都回带孩子做灯笼。用python对"对折灯笼“的纸模进行不同图案的填充(区分物权) 【教学类-39】A4红纸-国旗灯笼纸模(庆祝中华人民共和国成立74周年)_a4 打印 灯笼-CSDN博客文章浏览阅读1…...

C++ Primer 类的静态成员

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...

【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记

本文内容为重写上一节课中的单链表,将其重构成更易于用户使用的链表,实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式,在 Java 中一般不会这么定义,因为这样用户可能需要非常了解…...

【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin scatter plot Venn)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载画图1画图2画图3画图4画图5画图6画图7参考介绍 【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin & scatter plot & Venn) 加载R包 library…...

Linux中POSIX应用场景

Linux 提供了丰富的 POSIX(Portable Operating System Interface)标准接口,这些接口可以帮助开发者编写可移植、高效的应用程序。POSIX 标准定义了一系列系统调用和库函数,涵盖了文件操作、进程管理、线程管理、信号处理、同步机制…...

量子算法导论

重学了量子算法,不知道是温故而知新,还是之前的教材没有讲过这个概念。 如果把(图灵机)计算机比作一个查询机器,输入x通过f(x)作用得出结果,而查询的过程就是计算的过程。 中文解释…...

nasm - BasicWindow_64

文章目录 nasm - BasicWindow_64概述笔记my_build.batnasm_main.asmEND nasm - BasicWindow_64 概述 学习网上找到的demo. x64和x86的汇编源码还差挺多的。 x64的汇编代码不好写,细节整不对,程序就不运行。 如果要查为啥不运行,也要看和正向…...

SpringBoot:SSL证书部署+SpringBoot实现HTTPS安全访问

一、前言 SSL协议介于TCP/IP协议栈的第四层(传输层)和第七层(应用层)之间,为基于TCP的应用层协议(如HTTP)提供安全连接。它通过在客户端和服务器之间建立一个加密的通道,确保数据在传…...

selenium爬取苏宁易购平台某产品的评论

目录 selenium的介绍 1、 selenium是什么? 2、selenium的工作原理 3、如何使用selenium? webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么? 用于Web应用程序测试的工具。可以驱动浏览…...

Spark提交任务

1、Spark提交任务到Yarn 1.1、DwKuduApp spark-submit --class com.io.etl.dwkudu.DwKuduApp \ --files /etl/etl-dwkudu/conf/doris.property,/etl/etl-dwkudu/conf/redis.property,/etl/etl-dwkudu/conf/log4j.property \ --master yarn --deploy-mode cluster \ --driver-…...

游戏引擎学习第113天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板:优化的基本过程 在游戏编程中,优化是一个非常重要的学习内容,尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度,以及如何提升其性能。在这个阶段,已经…...

token是什么

在自然语言处理(NLP)和机器学习的背景下,token 是指模型在处理文本时的最小单位。通常,这个单位可以是单词、字符,或者词的一部分。具体来说,token 的定义取决于你使用的模型和它的分词方式。 举个例子&am…...

23. AI-大语言模型-DeepSeek赋能开发-Spring AI集成

文章目录 前言一、Spring AI 集成 DeepSeek1. 开发AI程序2. DeepSeek 大模型3. 集成 DeepSeek 大模型1. 接入前准备2. 引入依赖3. 工程配置4. 调用示例5. 小结 4. 集成第三方平台(已集成 DeepSeek 大模型)1. 接入前准备2. POM依赖3. 工程配置4. 调用示例…...

IPv6报头40字节具体怎么分配的?

目录 IPv6报头结构 字段详解 示例代码:IPv6报头的Python实现 输出示例 IPv6协议是为了解决IPv4地址耗尽问题而设计的下一代互联网协议。与IPv4相比,IPv6不仅提供了更大的地址空间,还简化了报头结构,提高了网络设备的处理效率。…...

驱动开发、移植

一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作, sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...

BFS与Flood Fill:算法原理、实现细节与复杂度分析

目录 1. 概述 2. BFS 的基本原理 3. Flood Fill 算法 4. BFS 实现 Flood Fill 的步骤 5. C 实现 6. 代码解析 7. 复杂度分析 8. 应用场景 总结 1. 概述 Flood Fill 算法是一种用于填充封闭区域的算法,常用于图像处理、绘图工具和游戏开发中。BFS&#xff08…...

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备,换句话说,没有交换机就没法搭建局域网 交换机不能让局域网连…...

雷龙CS SD NAND(贴片式TF卡)测评体验

一、产品概述 近期获赠雷龙科技(Longsto)推出的CS系列贴片式SD NAND存储解决方案,包含两片工业级贴片式NAND芯片(CSNP16GCR01-AOW)及全兼容转接板。该方案支持TF卡形态扩展,实现高可靠性嵌入式存储应用。 …...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...