为何lateinit变量未初始化引发的UninitializedPropertyAccessException异常未被捕获处理?
问题分析
你遇到的问题是:当latLngFrom和latLngTo这两个lateinit变量未初始化时,点击按钮后应用直接崩溃,而非触发你预期的Toast提示。这主要是因为依赖异常捕获来处理预期的业务校验本身就存在不可靠性,再加上可能存在异常类型匹配失效的情况(比如没正确导入kotlin.UninitializedPropertyAccessException类,导致catch块无法识别实际抛出的异常),最终导致崩溃。
解决方案
更稳妥且高效的方式是直接检查lateinit变量的初始化状态,Kotlin专门提供了::变量名.isInitialized语法来做这件事,完全不需要依赖异常捕获。
修改后的代码如下:
private fun button() { route_button.setOnClickListener(View.OnClickListener { // 先校验两个变量是否都完成初始化 if (!::latLngFrom.isInitialized || !::latLngTo.isInitialized) { Toast.makeText(this, "Введите оба адреса", Toast.LENGTH_SHORT).show() return@OnClickListener // 终止后续逻辑执行 } // 变量已初始化,执行后续路由操作 setContentView(R.layout.activity_maps_route) val fragment = supportFragmentManager.findFragmentById(R.id.routeFragment) as RouteFragment fragment.setLatLng(latLngFrom, latLngTo) Log.d(TAG, "button: From: $latLngFrom, To: $latLngTo") }) }
为什么这个方案更好?
- 可靠性拉满:直接通过Kotlin官方API判断初始化状态,完全避免了异常捕获可能失效的问题;
- 性能更优:异常处理的系统开销远大于简单的条件判断;
- 可读性更强:一眼就能看出这是业务层面的参数校验,而非处理意外错误。
如果坚持要用try-catch写法,请务必确保导入了正确的异常类:
import kotlin.UninitializedPropertyAccessException
但还是强烈推荐上面的条件判断方案,这才是处理lateinit变量初始化校验的标准姿势。
内容的提问来源于stack exchange,提问作者lian. lun
相关产品推荐
相关产品推荐

