You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加try/catch后Realm代码出现Unresolved reference的解决咨询

问题原因与解决方案

问题根源

你添加的try/catch块导致appServiceInstance的类型变为Unit,而非Realm的App类型——因为Kotlin lambda的返回值是最后一行表达式的结果,你的catch块最后执行的是Logger.e(e.stackTraceToString())(返回Unit),所以整个lazy委托的变量类型被推断为Unit,自然无法找到currentUser属性。

修复方案

需要确保lazy块始终返回App类型的实例(或显式声明可空类型并处理null场景),以下是两种可行方案:

方案1:创建失败时重新抛出异常(推荐,因为后续同步逻辑依赖App实例)

修改appServiceInstance的lazy初始化块,在catch中记录日志后重新抛出异常,保证变量类型为App:

private val appServiceInstance by lazy {
    // If logs are on app level then it set for everything ..
    val configuration =
        AppConfiguration.Builder("application-0-rpbsh")
            .log(LogLevel.ALL).build()

    try {
        App.create(configuration)
    } catch (e: Exception) {
        Logger.e("Exception caught: ${e.message}")
        Logger.e(e.stackTraceToString())
        throw e // 重新抛出异常,确保lazy块返回App类型
    }
}

方案2:允许返回null并在后续逻辑中处理

如果需要容忍App创建失败的场景,可显式声明变量为可空类型,在catch中返回null,并在setupRealmSync中做非空校验:

// 显式声明类型为App?
private val appServiceInstance: App? by lazy {
    val configuration =
        AppConfiguration.Builder("application-0-rpbsh")
            .log(LogLevel.ALL).build()

    try {
        App.create(configuration)
    } catch (e: Exception) {
        Logger.e("Exception caught: ${e.message}")
        Logger.e(e.stackTraceToString())
        null // 返回null
    }
}

private fun setupRealmSync() {
    // 先校验App实例是否存在
    val app = appServiceInstance ?: throw IllegalStateException("Failed to initialize Realm App instance")
    val user = runBlocking { app.currentUser!! } 
    // 后续代码保持不变
}

额外提示

如果currentUser是异步获取的(Realm某些版本中currentUser是suspend属性),建议将setupRealmSync改为suspend函数,避免使用runBlocking阻塞线程:

private suspend fun setupRealmSync() {
    val user = appServiceInstance.currentUser!!
    // 后续代码不变
}

内容的提问来源于stack exchange,提问作者user443654

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:00:21