使用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用户友好功能,还是我错过了什么?
特定问题:除了不忘记安全广播之外,是否有其他可能解决这些问题的方法? :)
最佳答案
可悲的是这种特定的方法:
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>()
关于android-studio - Kotlin的安全广播(或在这种情况下为 “unsafe” -cast)隐藏了Android Studio可能出现的NullPointerException警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58051531/