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

标签 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用户友好功能,还是我错过了什么?

特定问题:除了不忘记安全广播之外,是否有其他可能解决这些问题的方法? :)

最佳答案

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

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/

相关文章:

java - Android Studio 布局编辑器无法呈现自定义 View

android - 为什么我不能从 AsyncTask 访问全局变量?

android - 为什么我可以在 Kotlin 的伴生对象之外访问私有(private)乐趣?

具有自动完成功能的 Python IDE

java - 另一个 Netbeans 问题 |找不到符号方法,但声明正确

javascript - 如何在大型网站中找到引用的 Javascript 方法?

Android - Facebook 集成 : Impossible to Import com. facebook.Session

Android Studio : String resources showing in design view, 不在模拟器中

android - 如何设置 Android Studio 以便在离线时(断开与互联网的连接)进行编译

java - 当我尝试git push heroku时出现错误