Kotlin项目如何全局配置未注解类型默认视为@Nullable避免空校验崩溃
解决方案
不需要将对应类改回Java实现,有两种处理方案
方案1:项目级全局配置,所有无空性注解的Java类型默认视为可空
在项目的编译配置中添加Kotlin编译器参数即可实现,针对Gradle(含Android)项目的配置方式如下:
- 如果使用Kotlin DSL(
build.gradle.kts):
// 模块级build.gradle.kts kotlin { compilerOptions { freeCompilerArgs.addAll( // 未明确标注非空的Java类型全部默认识别为可空 "-Xnullability-annotations=javax.annotation.Nonnull:nonnull", "-Xjsr305=strict", // 关闭Java类型的非空断言,避免空值传入时直接崩溃 "-Xnullability-assertions-for-java-types=disable" ) } }
- 如果使用Groovy DSL(
build.gradle):
// 模块级build.gradle android { kotlinOptions { freeCompilerArgs += [ "-Xnullability-annotations=javax.annotation.Nonnull:nonnull", "-Xjsr305=strict", "-Xnullability-assertions-for-java-types=disable" ] } }
配置生效后,Kotlin会自动将无空性注解的Java方法参数、返回值识别为可空类型,你提到的onFailure方法默认签名会变成override fun onFailure(e: IOException, response: Response?),空值传入不会触发空安全崩溃。
方案2:仅针对当前WebSocketListener接口调整,无需全局配置
如果不需要修改全局空性规则,可以直接手动修改Kotlin实现类的方法签名,主动将response参数标注为可空:
override fun onFailure(e: IOException, response: Response?) { e.printStackTrace() // 正常做空判断处理即可 }
Kotlin允许在实现Java接口时,将无空注解的参数手动标注为可空,兼容Java侧的空值传入,不会出现签名不匹配的问题。
内容的提问来源于stack exchange,提问作者Anticro
相关产品推荐
相关产品推荐

