首页 > 解决方案 > Kotlin 的安全转换(或在此上下文中为“不安全”转换)隐藏了 Android Studio 可能发出的 NullPointerException 警告

问题描述

在使用 Java 进行 AS 开发时,下一行显示toggleSoftInput可能产生 NPE 的警告。如果您忘记了 NPE 检查,这将非常有帮助。

InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(....);

但在 Kotlin 的情况下,这成为一个问题。使用as意味着 IDE 不会费心检查是否toggleSoftInput()会产生 NPE,因为as隐含地暗示会产生 NPE。

val imm = mContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.toggleSoftInput()

一旦我使用了 safe-cast as?,IDE 就会警告我进行安全调用immas it may be null

一般问题:如果开发人员忘记进行安全转换怎么办,Kotlin 的安全转换是否隐含地扼杀了 IDE 的用户友好功能,或者我错过了什么?

具体问题:除了不要忘记安全投射之外,还有什么可能的方法来解决这些问题?:)

标签: android-studiokotlinide

解决方案


可悲的是这个特定的方法:

context.getSystemService(@NonNull String name)

是非常旧的 API,这是它的缺陷之一——它返回一个Object未指定的类型和可空性,所以除了执行不安全/安全的转换之外别无他法。

您几乎没有更新的替代方案可以为您提供安全的可为空的 Service 类对象:

// available since API 23:
val ims23 = context.getSystemService(InputMethodManager::class.java)

// available in androidx.core
val imsCompat = ContextCompat.getSystemService(context, InputMethodManager::class.java)

// available in androidx.core:core-ktx
val imsKtx = context.getSystemService<InputMethodManager>()

推荐阅读