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

第一百二十七回 空安全

文章目录

  • 概念介绍
  • 使用方法
  • 示例代码

我们在上一章回中介绍了级联操作符相关的内容,本章回中将介绍 空安全.闲话休提,让我们一起Talk Flutter吧。

概念介绍

在编译语言中都有空指针或者空对象(null),它们会引起程序的异常。在移动开发中如果使用Java和OC开发程序,发生这类异常后会使应用程序被系统强制关闭,业内通称FATA异常,crash或者叫程序闪退。这种异常是比较严重的程序错误,为了避免程序中发生这种异常dart在2.1版本中引入了空类型,并且基于空类型引入了安全机制,本章回将详细介绍空类型和基于该类型的空安全机制。

使用方法

在dart语言中使用问号表示空类型,定义变量或者对象时可以使用空类型,通常是在类型的后面加一个问号,这样的变量或者对象叫作可空变量或者可空对象,非空变量或者非空对象可以赋值给可空变量或者可空对象,但是可空变量或者可空对象不能赋值给非空变量或者非空对象。

有了空类型后,变量或者对象可能为空,因此,我们在使用空变量或者空对象时需要判断变量或者对象是否为空,不然会引起编译错误,这便是安全机制。有了此机制后把空对象引发的异步提前到程序编译阶段,这样有助于提前发现和解决程序中的错误。

判断空对象使用"?.","!."或者"??"操作符,把这些操作符添加到空对象后面就可以。这些操作符有着不同的含义,详细如下:

  • ?.: 如果对象为空则不做任何操作,否则通过点操作符访问对象的属性或者方法;
  • !.: 当前对象肯定不为空并且通过点操作符访问对象的属性或者方法;
  • ??: 如果对象为空则执行操作符后面的内容,否则不做任何操作;

除了这些操作符外还可以使用三元操作符或者if/else语句来判断对象是否为空,这些内容是基础知识,我就不详细介绍了,稍后我们将通过代码来演示操作符的用法。

示例代码

  ///定义可以空变量和可空对象int ? nonIntValue;TestObject? nonTObj;///空安全相关内容nonIntValue = 3;TestObject temp = TestObject(1, 'good');///非空变量可以赋值给可空变量,但是可空变量不能赋值给非空变量// nonTObj = temp;// temp = nonTObj;///使用可空对象,如果对象为空则不做任何操作,不会访问对象的属性adebugPrint('value: ${nonTObj?.a}');///变量的值肯定不为空,这样做不太好,虽然可以通过编译,但是会引起运行时异常// debugPrint('value: ${nonTObj!.a}');///判断对象是否为空:如果为空则括号中的值为temp,否则为nonTObjdebugPrint('value: ${(nonTObj ?? temp).toString()}');if(nonTObj == null) {debugPrint('nonTobj is null');} else {debugPrint('nonTobj is not null');}///三元操作符(nonTObj == null) ? debugPrint('nonTobj is null'): debugPrint('nonTobj is not null');

上面代码中使用的TestObject是自定义的类型,我们没有公布它的源代码,大家可以自己定义一个类型,或者使用语言自带的String类型,总之只要是可以创建对象的类型就可以。

我们在代码中添加了详细的注释,这样方便大家理解代码,建议大家自己动手去编译程序,通过程序的运行结果来分析代码,这样有助于大家更好地掌握空类型和空安全相关的内容。

看官们,与空安全相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

http://www.lryc.cn/news/142297.html

相关文章:

  • js判断类型:typeof Object.prototype.toString instanceof constructor有什么区别?一文讲清楚
  • uview ui 1.x ActonSheet项太多,设置滚动
  • 信息化发展2
  • ubuntu18 + ros2 eloquent +python3.6
  • 围棋与育种
  • Python第三方库纵览
  • 测试.net开源音频库NAudio
  • 三方接口调用设计方案
  • OLED透明屏全贴合技术:未来显示技术的突破性创新
  • map、sync.map、concurrent-map适用场景与源码解析
  • 分布式事物实现方案及优缺点
  • java使用@interface和反射来动态生成excel
  • 【微服务】04-Polly实现失败重试和限流熔断
  • 如何使用HTML5新增的标签来构建语义化的页面结构?
  • Vmware 虚拟机挂起恢复后发现无法 Ping 通,无法连接到主机
  • Web自动化测试之图文验证码的解决方案
  • 软考高级系统架构设计师系列论文九十:论分布式数据库的设计与实现
  • Day 84:网络结构与参数
  • vue2.6及以下版本导入 TDesign UI组件库
  • VR/AR/眼镜投屏充电方案(LDR6020)
  • 区分什么是Java内存模型(JMM)和 JVM运行时数据区
  • Flask狼书笔记 | 04_表单
  • RabbitMQ+springboot用延迟插件实现延迟消息的发送
  • 多线程和并发(1)—等待/通知模型
  • 浏览器的事件循环
  • 跳跃游戏 II【贪心算法】
  • promise
  • 前端面试:【网络协议与性能优化】HTTP/HTTPS、TCP/IP和WebSocket
  • 设计模式之工厂模式(万字长文)
  • CNN 02(CNN原理)