android-studio - 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 就会警告我进行安全调用imm
as it may be 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>()
推荐阅读
- javascript - 用户点击推送通知后如何更改视图 - Firebase - 本机脚本
- c++ - 链接器错误:在 VS2019 中使用 CMake 项目的函数“int __cdecl invoke_main(void)”中引用了未解析的外部符号 _main
- reactjs - 如何在 React Native 中存储和更新数据
- python-3.x - Python - 检查应用程序是否是 Web 浏览器
- r - R:从多列创建新的基于列的值列表
- kubernetes - Kubernetes - Nodeport 与负载均衡器
- ios - 从另一个应用程序使用 iOS Microsoft Word 本机应用程序打开 .docx 文件(托管在 OneDrive 上)
- swift - 如何删除领域父对象及其所有子对象?
- elixir - 在 Windows 上运行 Elixir 应用程序:无法设置短节点名称
- python - 获取 Seaborn 联合图的最大密度坐标