NullPointerException → Kotlin 空安全

NullPointerException → Kotlin 空安全

老写法(Java --- NPE 高发代码)

scss 复制代码
// 1. 链式调用中间为 null
String city = user.getAddress().getCity(); // address 可能是 null

// 2. Intent 取值没判空
String title = getIntent().getStringExtra("title");
int length = title.length(); // title 可能是 null

// 3. findViewById 在错误的 layout
TextView tv = findViewById(R.id.tv_not_exist);
tv.setText("hello"); // tv 是 null

问题在哪里

Java 的类型系统不区分"可以为 null"和"不能为 null",null 可以出现在任何地方。@Nullable / @NonNull 注解只是提示,不强制编译检查。线上 NPE 是最常见的崩溃原因。

新写法(Kotlin 空安全)

ini 复制代码
// 1. 安全调用 --- 中间任意一环为 null,整个表达式返回 null
val city = user?.address?.city

// 2. Elvis 操作符 --- null 时给默认值
val title = intent.getStringExtra("title") ?: ""
val length = title.length

// 3. let --- 不为 null 时执行
user?.address?.city?.let { city ->
    updateCityUI(city)
}

// 4. 强制非 null --- !!(尽量不用,确定不为 null 时才用)
val tv = findViewById<TextView>(R.id.tv_title)
tv!!.text = "hello"

一句话注意

把 Java 代码迁移到 Kotlin 后,NPE 几乎全部在编译期被消灭。Kotlin 的规则很简单:类型后面带 ? 的可以为 null,不带的不能为 null。Java 代码和 Kotlin 交互的地方需要特别注意------Java 返回的类型在 Kotlin 里是"平台类型",编译器不会强制检查 null,需要手动声明为可空类型。

老项目迁移期间,Java 和 Kotlin 混编阶段最容易在边界处出问题。建议在 Java 方法上统一加 @Nullable / @NonNull 注解,Kotlin 编译器会识别这些注解来做空检查。


Java Android 老项目迁移系列,持续更新中。

相关推荐
学长毕设7 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
驰骋工作流7 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
zzu123zsw8 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号9 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
传奇开心果编程9 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠9 小时前
泛微OAe9-后端二开异步调用
java
我是唐青枫10 小时前
Kotlin Delegation 委托详解
开发语言·kotlin
秋天的怀念_David10 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放10 小时前
Python基础语法练习题(73)
java·前端·python