【问题标题】:UNINITIALIZED_VARIABLE Variable _longPressed must be inistialized [duplicate]UNINITIALIZED_VARIABLE 变量 _longPressed 必须初始化 [重复]
【发布时间】:2017-09-08 09:31:59
【问题描述】:

我有一个 Handler 和 Runnable,当 runnable 执行时我需要从我的处理程序中删除回调。

如果我这样做,就那样

private val _handler = Handler()

private val _longPressed: Runnable = Runnable {
    _handler.removeCallbacks(_longPressed)
}

编译时错误发生错误UNINITIALIZED_VARIABLE

如果我将removeCallBacks方法移到函数中,错误就消失了,我很感兴趣,有什么区别?

private val _longPressed: Runnable = Runnable {
    removeRunnable()
}

fun removeRunnable(){
    _handler.removeCallbacks(_longPressed)
}

【问题讨论】:

  • 你能发布_handler变量的声明吗?
  • 好的,我已经更新了我的问题
  • @JemoMgebrishvili 我不太确定在 Runnable 下使用时尚未分配 _longPressed。但是在java中我们使用 this 这样尝试
  • 同意@Raghavendra,使用this 应该可以解决问题。因为this里面Runnable基本上指的是_longPressed
  • 对不起,你是对的。如果您将 runnable 声明为 object : Runnable {...} 并实现 run 方法,那么您可以使用 this 引用 Runnable

标签: android kotlin


【解决方案1】:

在编译时进行_longPressed 变量赋值时,它首先评估Runnable 代码(变量的值)。由于在这种情况下_longPressed 不存在,因此会引发编译错误。

在后一种情况下,在编译时评估 Runnable 代码时,它只知道它必须调用一个现有函数 removeRunnable,该函数引用了一个存在于类 (_longPressed) 上的变量。

【讨论】:

  • 是的,我想是的,但是可以吗?是否有可能执行可运行代码块_longPressed可能未初始化?
  • 否,因为可运行代码块将在实例化包含它的类后立即分配给 _longPressed 变量
  • 比它没有意义,显示错误是吗?
  • 它显示错误是因为 kotlin 在进行赋值时会查找变量自引用,因为您可能会在赋值完成之前调用同一个变量。它不会区分何时调用它,它只是不允许您这样做。检查引用的重复答案以及该答案中引用的另一个one
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多