Kotlin的安全广播(或在这种情况下为“不安全”广播)隐藏了Android Studio可能出现的NullPointerException警告

时间:2019-09-22 17:05:10

标签: android-studio kotlin ide

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

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

但是对于Kotlin,这成为一个问题。使用as进行强制转换意味着IDE不会费心检查toggleSoftInput()是否会产生NPE,因为as隐含了这种说法。

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

一旦我使用安全广播as?,IDE就会警告我对imm进行安全呼叫,因为它可能是null

一般问题:如果开发人员忘记了安全广播该怎么办,不是Kotlin的安全广播暗中破坏了IDE的用户友好功能,还是我错过了一些东西?

特定问题:除了忘记广播之外,还有什么可能的方法来解决这些问题? :)

1 个答案:

答案 0 :(得分:2)

可悲的是,这种特定方法:

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>()