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 老项目迁移系列,持续更新中。

相关推荐
十年Java程序媛21 分钟前
Java 接口和抽象类对比|Java8 新特性,抛弃老旧八股,正确选型
java·spring boot·后端
caoerzhong23 分钟前
JeeWMS 开源 WMS 部署避坑指南:Java 仓库管理系统的环境基线、四类根因与可复现交付
java·开发语言·开源
用户37215742613524 分钟前
Java 合并 PDF 文件:完整合并、指定页面合并与流合并
java
for_ever_love__1 小时前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram
java资料站1 小时前
五、Spring AI Alibaba · Memory · Saver(短期会话)
java·spring·microsoft
浪潮IT馆2 小时前
Android Studio 非最新版本下载安装教程
android·ide·android studio
夜之眷属2 小时前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
波加曼大王2 小时前
# vLLM不要迷信PagedAttention神话,聊聊线上藏着的内部碎片陷阱
java·架构
SL_staff2 小时前
目标健康度自检清单:开发者视角下的目标-计划-任务链路断点诊断
java·开源·github
for_ever_love__2 小时前
MySQL 高频面试题 30 问:索引、事务、锁、日志、主从与分库分表(MySQL 8.0 版)
java·数据库·spring boot·mysql·spring cloud·面试·总结